原子release操作是否会被覆盖?线程C的依赖来源确认
关于C++原子内存序的依赖可见性问题
这个问题得从C++原子操作的release-acquire同步规则说起,咱们一步步拆解清楚:
核心规则回顾
首先要明确release和acquire语义的核心逻辑:
- 一个原子变量的release写操作,只会和那些读取到该写操作结果的acquire读操作,建立「synchronizes-with(同步)」关系。
- 只有建立了这种同步关系,写线程中在release操作之前的所有非原子操作、非relaxed语义的原子操作,才会被读线程保证可见。
针对你的场景分析
回到你给出的场景:
- 线程A执行
atomic<int> i的release存储/交换操作,但线程B后续只是执行了另一个release语义的存储操作,并没有读取线程A写入的i值——这意味着线程A和B之间没有任何标准保证的同步关系,A的操作不会自动对B可见(硬件层面可能有巧合,但C++标准不做保证)。 - 线程C的
fetch_add(0, memory_order_acquire)本质就是一个acquire语义的读操作。由于线程B是在线程A之后执行存储的,正常情况下C会读取到B写入的值,此时C只会和B的release操作建立同步关系。
结论
线程C仅会获取线程B的依赖:也就是B在release存储之前的所有操作,C都能通过同步关系保证可见;而线程A的操作和C之间没有标准层面的同步关系,除非B的操作依赖于A(比如B先读取了A写入的i值再执行存储),但你的问题描述中并没有这种情况,因此C无法保证看到线程A的操作。
内容的提问来源于stack exchange,提问作者rnpl
相关产品推荐
相关产品推荐

