- tags: C++11 内存模型,C/C++
C++ 还添加了较弱的原子,可以使用 atomic_store_explicit
和 atomic_load_explicit
以及附加的n内存排序参数来访问这些原子。使用 memory_order_seq_cst
使显式调用等效于C++ 同步原子(atomic)较短的调用。
较弱的原子称为 acquire/release
原子,一个 release
如果被后来的 acquire
观察到,那么就创建了一个 happen-before
的关系(从 release
到 acquire
)。这个术语意在唤起 mutex:release
就像 unlock mutex
, acquire
就像锁定同一个 mutex
。release
之前执行的写入必须对后续 acquire
之后执行的读取可见,就像解锁 mutex
之前执行的写入必须对后解锁 mutex
之后执行的读取可见一样。
atomic<int> done;
// Thread 1 // Thread 2
atomic_store(&done, 1, memory_order_release); while(atomic_load(&done, memory_order_acquire) == 0) { /* loop */ }
acquire/release
原子只对单个内存位置的操作进行顺序一致的交替执行,所以属于内存一致性(coherence)而非顺序一致性。
来看下面 litmus test:
Litmus Test: Store Buffering
Can this program see r1 = 0, r2 = 0?
// Thread 1 // Thread 2
x = 1 y = 1
r1 = y r2 = x
On sequentially consistent hardware: no.
On x86 (or other TSO): yes!
On ARM/POWER: yes!
On Java (using volatiles): no.
On C++11 (sequentially consistent atomics): no.
On C++11 (acquire/release atomics): yes!