在一个线程中创建一个对象,并使用std :: atomic访问另一个线程

Lor*_*ein 1 c++ multithreading c++11

在C++ 11中,如果我在一个线程中创建一个对象并将其设置为a std::atomic<T*>,是否可以保证构造函数在设置原子变量之前已经完成执行?

具体来说,在下面的代码中,如果"if"语句的计算结果为true,是否保证Widget()构造函数已完成?

std::atomic<Widget*> widget = NULL;
Run Code Online (Sandbox Code Playgroud)

在线程A中:

widget = new Widget();
Run Code Online (Sandbox Code Playgroud)

在主题B中:

if(widget) {
    // Do something with widget
}
Run Code Online (Sandbox Code Playgroud)

Cas*_*sey 5

简短回答:是的.

答案很长:构造函数的效果在widget按照5.17 [expr.ass]/1 的赋值之前进行了排序.在所有情况下,赋值在右和左操作数的值计算之后,以及在计算值之前进行排序.赋值表达式." 因此,构造函数完成 - 在任何读取widget同步之前 - 与相关的写入一起发生widget.