C++编译器跨线程启动重排读写:x=5是否先于线程执行?
多线程中赋值操作与线程启动的内存顺序保证
结论:x = 5的赋值操作可以保证在线程启动前完成,不存在因编译器重排导致的数据竞争风险。
在C++标准的内存模型中,std::thread的构造函数存在明确的**先行发生(happens-before)**语义:主线程中在std::thread构造函数调用完成前的所有内存操作,都先行发生于新线程执行的任何代码。这意味着编译器和处理器都不能对x = 5和线程启动的顺序进行重排,子线程执行++x时,必然能看到x = 5的赋值结果。
你的示例代码如下:
int main() { int x = 0; x = 5; auto t = std::thread([&x]() { ++x; }); t.join(); return 0; }
另外,由于主线程调用了t.join(),子线程的所有操作也会先行发生于join()调用完成后的主线程操作,整个流程的内存可见性完全符合标准要求,不存在数据竞争。
内容的提问来源于stack exchange,提问作者Matias Grioni
相关产品推荐
相关产品推荐

