我正在尝试理解C++11内存排序的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()会因为acquire-release semantics而synchronize-with sync.load(),但是这个语义能保证release之前的内存操作会进入内存(内存)吗?
发布于 2017-09-15 04:24:38
引用安东尼·威廉姆斯的"C++ Concurrency in Action“中一个非常相似的示例(清单5.8):
从atm_y加载的断言永远不会失败,因为对atm_y的存储发生在要同步的存储之前(它们在同一个线程中)。因为要同步的存储与从sync加载同步,所以在从sync加载之前也会发生到atm_y的存储,进而在从atm_y加载之前也会发生。
同样的逻辑也适用于对global_x的赋值。赋值发生在要同步的存储之前,所以断言永远不会触发。
https://stackoverflow.com/questions/46225563
复制相似问题