- tags: C++11 内存模型
C++ 采用了顺序一致的原子变量,很像Java 同步原子(volatile)(与 C++ volatile 没有关系)。
atomic<int> done;
// Thread 1 // Thread 2
atomic_store(&done, 1); while(atomic_load(&done) == 0) { /* loop */ }
C++ 采用了顺序一致的原子变量,很像Java 同步原子(volatile)(与 C++ volatile 没有关系)。
atomic<int> done;
// Thread 1 // Thread 2
atomic_store(&done, 1); while(atomic_load(&done) == 0) { /* loop */ }
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?...