C++ sequened-before与synchronizes-with
请区分C++内存模型中的sequenced-before和synchronizes-with,并举例说明其在多线程中的协同作用。
回答
我是大山
sequenced-before:单线程内的求值顺序。例如i = j++中,j++的副作用sequenced-before赋值给i。
synchronizes-with:线程间同步关系。原子操作的release操作与另一个线程的acquire操作建立synchronizes-with关系。
协同示例:
std::atomic<bool> ready{false};
int data = 0;
// 线程1:生产者
data = 42; // A
ready.store(true, release); // B, release
// 线程2:消费者
while (!ready.load(acquire)); // C, acquire, B synch-with C
int x = data; // D, A sequenced-before B, 所以data=42可见
A sequenced-before B,B synchronizes-with C,C sequenced-before D,因此A inter-thread happens-before D。