线程创建操作是否隐含happens-before关系?代码场景分析咨询
线程创建操作的Happens-Before关系与数据竞争分析
这个问题问到了C++并发模型里一个关键的基础点——线程创建本身的内存可见性保证,咱们一步步拆解来看:
线程创建确实隐含明确的Happens-Before关系
从C++11开始的并发标准里明确规定:主线程中在创建std::thread对象之前完成的所有内存写操作,都happens-before新线程中执行的任何操作。放到你的代码里,#1的int data = 1;完全在thread t(func, &data);这行之前执行,所以这个赋值操作对后续启动的子线程是完全可见的。完全能确保#2的输出为1
因为上面的happens-before关系存在,子线程在执行cout << *ptr时,看到的data的值一定是主线程已经赋值好的1,不会出现未定义的脏读情况。该代码不存在数据竞争
数据竞争的核心判定条件是:两个不同线程对同一内存位置执行操作,其中至少一个是写操作,且没有同步机制约束操作顺序。而这里:- 只有主线程对
data执行了写操作(#1) - 子线程只执行读操作(#2)
- 线程创建带来的happens-before关系已经明确了写操作先于读操作,完全符合同步要求,所以不存在数据竞争。
- 只有主线程对
另外补充个小细节:代码里的t.join()是用来等待子线程执行完成,避免主线程提前退出导致子线程被强制终止的问题,但即使没有join()(当然实际开发中绝对不能这么写),线程创建的happens-before关系依然成立——只要子线程能运行起来,它就能看到data=1。
内容的提问来源于stack exchange,提问作者olist
相关产品推荐
相关产品推荐

