std::atomic_flag在类构造函数中初始化一个安全的方法是什么?
这个问题好像在问我要问的同一个问题 - 除了这里提问者抱怨编译问题.
我的问题涉及C++标准本身.根据此站点,std::atomic_flag未指定初始化using构造函数初始化程序语法.
std::atomic_flag static_flag = ATOMIC_FLAG_INIT; // static initialization,
// guaranteed to be available during dynamic initialization of static objects.
int main()
{
std::atomic_flag automatic_flag = ATOMIC_FLAG_INIT; // guaranteed to work
// std::atomic_flag another_flag(ATOMIC_FLAG_INIT); // unspecified
}
Run Code Online (Sandbox Code Playgroud)
这些信息是否正确?如果是这样,我认为:
struct Foo
{
Foo() : flag(ATOMIC_FLAG_INIT)
{ }
std::atomic_flag flag;
};
Run Code Online (Sandbox Code Playgroud)
......也没有说明.那么,这是否意味着我们不能使用std::atomic_flag作为类的成员变量?或者如果我们std::atomic_flag::clear()从类构造函数中简单调用它是否安全?
Pra*_*ian 12
关于使用的措辞ATOMIC_FLAG_INIT自N3337改为N3936(目前的C++ 14草案).前者示出了ATOMIC_FLAG_INIT在示例中宏的复制初始化上下文中的可能用法,其是非规范的,并且未提及关于在其他初始化上下文中的使用的任何内容.
N3936阐明了用法,并且不再列出复制初始化用法作为示例,而是作为描述本身的一部分.
§29.7/ 4 [atomics.flag]
ATOMIC_FLAG_INIT应以这样的方式定义宏,使其可用于将类型的对象初始化atomic_flag为清除状态.宏可以以下列形式使用:Run Code Online (Sandbox Code Playgroud)atomic_flag guard = ATOMIC_FLAG_INIT;未指定宏是否可以在其他初始化上下文中使用.对于完整的静态持续时间对象,该初始化应该是静态的.除非使用初始化
ATOMIC_FLAG_INIT,否则未指定atomic_flag对象是否具有设置或清除的初始状态.
这里讨论了这些变化的基本原理.
所以你是对的,不能依赖在成员初始化列表中使用宏.解决方案是使用非静态数据成员初始化程序或者括号或等于初始化程序来初始化atomic_flag.然后它将在复制初始化上下文中初始化.
struct Foo
{
std::atomic_flag flag = ATOMIC_FLAG_INIT;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2541 次 |
| 最近记录: |