我想使用std::atomic_bool
,因为我想有这应该由不同的线程访问一个布尔值。
这是一个static
成员变量。 问题是,我想使用的初始化false
作为第一状态。 通常我会那样做: std::atomic_bool World::mStopEvent = false;
但问题似乎是,它没有考虑false
的构造。 因此,如何我应该这样初始化的变量? 我使用VS 2012。
我想使用std::atomic_bool
,因为我想有这应该由不同的线程访问一个布尔值。
这是一个static
成员变量。 问题是,我想使用的初始化false
作为第一状态。 通常我会那样做: std::atomic_bool World::mStopEvent = false;
但问题似乎是,它没有考虑false
的构造。 因此,如何我应该这样初始化的变量? 我使用VS 2012。
这是一个在Visual Studio 2012(称为VC11)已知的问题 ,您应该对现有的连接项目让微软知道它会影响更多的人,因为他们已经推迟修复投票。
嗨,
感谢您报告这个错误。 我是STL微软的维护者,我想让你知道,虽然这个错误仍然在我们的数据库的活动,也不会被固定在VC11 RTM(VS 2012 RTM)。 所有的错误是对我们很重要,但有些人比其他人更严重,并上升到我们的优先级队列的顶部。
我复制并粘贴在所有STL的主动连接错误的这种反应,但是下面的简短评论特别适用于你的错误:
- 是的,我们正在丢失这些构造
atomic_bool
,atomic_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>
现在。
试试这个:
atomic_bool my_bool = ATOMIC_VAR_INIT(false);
http://en.cppreference.com/w/cpp/atomic/ATOMIC_VAR_INIT
问题:
不能使用复制初始化 ,因为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
}
怎么样:
std::atomic_bool World::mStopEvent(false);