C++的Release-Acquire抽象语义与内存屏障

C++的Release-Acquire抽象语义与内存屏障 我们通过一个简单的多线程例子,来说明Release-Acquire的抽象语义,定义两个变量:int data; std::atomicbool flag;如果data需要现在线程1写,再在线程2被读,那么我们可以这么实现:线程 A (release): 线程 B (acquire): ───────────────── ───────────────── data = 36; // ① 普通写 flag.store(true, → while(!flag.load(memory_order_acquire)); // ③ memory_order_release); // ② value = data; // ④这样操作可以保证:如果 B 的 ③ 读到了 A 的 ② 写入的值( true ),那么 ① 写入的 data=42 对 ④ 可见。C++ 内存模型是抽象模型,分为两层:C++ 语言层面:happens‑before /synchronizes‑with(标准规定的逻辑)硬件 CPU 层面:编译器重排、CPU 乱序、Store Buffer、Invalidate Queue 硬件机制release store 的线程内约束flag.store(true, memory_order_release)在执行该 store 的线程(A)中:所有在这个 store 之前的读写操作,不能被重排到该 store 之后。data = 36; //① flag.store(..., release); //②规则:① 不能重排到②之后。允许:②之后的代码,可以重排跑到②前面;只拦 “前→后” 的重排。acquire load 的线程内约束flag.load(memory_order_acquire)在执行该 load 的线程(B)中:所有在