我试图了解C ++ 11 Memory Ordering的Acquire-Release Semantics
。
我不明白以下断言是否会失败:
#include <atomic>
#include <thread>
#include <cassert>
int global_x{0};
std::atomic_int sync{0};
std::atomic_int atm_y{0};
void thread1()
{
global_x=100;
atm_y.store(200, std::memory_order_relaxed);
sync.store(1,std::memory_order_release);
}
void thread2()
{
while(!sync.load(std::memory_order_acquire)){;}
assert(atm_y.load(std::memory_order_relaxed) == 200);
assert(global_x == 100);
}
int main()
{
global_x=0;
sync=0;
atm_y=0;
std::thread t1(thread1);
std::thread t2(thread2);
t1.join();
t2.join();
}
我知道sync.store()
会synchronize-with
sync.load()
因为acquire-release semantics
,但这种语义是否保证release
之前的内存操作会进入内存( RAM)?
答案 0 :(得分:2)
从Anthony Williams的“C ++ Concurrency in Action”中解释一个非常类似的例子(清单5.8):
来自atm_y的加载断言永远不会失败,因为atm_y的存储发生在商店同步之前(它们在同一个线程中)。因为要同步的商店与来自同步的加载同步,所以商店到atm_y也会发生 - 在来自同步和扩展的加载之前 - 从atm_y加载之前发生。
同样的逻辑适用于global_x的赋值。分配发生在商店同步之前,因此断言永远不会触发。