You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:06:28