初始化的std :: atomic_bool?(Initializing std::atomic_b

2019-08-18 18:42发布

我想使用std::atomic_bool ,因为我想有这应该由不同的线程访问一个布尔值。

这是一个static成员变量。 问题是,我想使用的初始化false作为第一状态。 通常我会那样做: std::atomic_bool World::mStopEvent = false;

但问题似乎是,它没有考虑false的构造。 因此,如何我应该这样初始化的变量? 我使用VS 2012。

Answer 1:

这是一个在Visual Studio 2012(称为VC11)已知的问题 ,您应该对现有的连接项目让微软知道它会影响更多的人,因为他们已经推迟修复投票。

嗨,

感谢您报告这个错误。 我是STL微软的维护者,我想让你知道,虽然这个错误仍然在我们的数据库的活动,也不会被固定在VC11 RTM(VS 2012 RTM)。 所有的错误是对我们很重要,但有些人比其他人更严重,并上升到我们的优先级队列的顶部。

我复制并粘贴在所有STL的主动连接错误的这种反应,但是下面的简短评论特别适用于你的错误:

  • 是的,我们正在丢失这些构造atomic_boolatomic_int等( atomic<bool>atomic<int> ,等有他们)。 29.5 [atomics.types.generic] / 7表示“有将被称为对应于原子的积分特类型,如表145中指定,并且命名类型atomic_bool对应于指定的atomic<bool> 。每个命名的类型是任一typedef到相应的专业化或基类对应的特化。如果它是一个基类的,应当支持相同的构件用作相应的专业化“。 这让我真的想使用typedef(1型总是比2种简单),但我需要看看是否能够引入任何其他问题。

我不能保证时,我们就可以解决这个bug,但我们希望尽可能范围内尽快(,这时我就会再发送响应) - 我们的第一个机会将是“带外” VC11和VC12之间发布该香草萨特在GoingNative 2012大会上宣布。

注:Connect不通知我一下意见。 如果您还有其他疑问,请发E-mail给我。

斯蒂芬T. Lavavej高级开发人员 - 的Visual C ++库stl@microsoft.com

基本上,你需要使用std::atomic<T>现在。



Answer 2:

试试这个:

atomic_bool my_bool = ATOMIC_VAR_INIT(false);

http://en.cppreference.com/w/cpp/atomic/ATOMIC_VAR_INIT



Answer 3:

问题:

不能使用复制初始化 ,因为std::atomic_bool没有拷贝构造:

std::atomic_bool World::mStopEvent = false; // ERROR!

事实上,上面是等效于:

std::atomic_bool World::mStopEvent = std::atomic_bool(false); // ERROR!

但是,您可以使用直接初始化

std::atomic_bool World::mStopEvent(false);

在你的愿望,你可以选择,而不是使用圆括号的括号:

std::atomic_bool World::mStopEvent{false};

BUG:

虽然副本初始化是非法的,无论你选择什么样的编译器,它似乎是标准库的附带VC11的实施具有一定不会让你无论是直接进行初始化的错误。

因此,如何我应该这样初始化的变量?

解决方法:

作为一种可能的解决方法,你可以提供一对静态的getter / setter包装是的 - 分别 - 设置并返回原子布尔标志的值,但不能确保之前已经不止一次地初始化至少一次,并没有在一个线程安全的方式所需的初始值(可以考虑一下这款某种延迟初始化的):

#include <atomic>
#include <mutex>

struct World
{
    static bool is_stop_event_set()
    {
        std::call_once(mStopEventInitFlag, [] () { mStopEvent = false; });
        return mStopEvent;
    }

    static void set_stop_event(bool value)
    {
        std::call_once(mStopEventInitFlag, [value] () { mStopEvent = value; });
        mStopEvent = value;
    }

    static std::atomic_bool mStopEvent;
    static std::once_flag mStopEventInitFlag;
};

std::atomic_bool World::mStopEvent;
std::once_flag World::mStopEventInitFlag;

现在而不是访问mStopEvent直接,其值应被通过读is_stop_event_set()函数:

#include <iostream>

int main()
{
    std::cout << World::is_stop_event_set(); // Will return false
}


Answer 4:

怎么样:

std::atomic_bool World::mStopEvent(false);


文章来源: Initializing std::atomic_bool?