据我所知,获取/释放语义充当顺序一致性和较弱内存模型(或 C++ 所说的“宽松”)所允许的无条件内存重新排序自由之间的中间立场。简而言之:
read
与按程序顺序跟随其后的任何 read
或 write
操作进行内存重新排序;write
与程序顺序中位于其之前的任何 read
或 write
操作进行内存重新排序。酷。但这些保证结合在一起,对我来说看起来像是顺序一致性。顺序一致性提供了哪些获取/释放语义在一起所不能提供的功能?能举个例子吗?
在硬件方面,acq/rel 允许一个线程内的存储/重新加载,在存储缓冲区中的值变得对其他线程全局可见之前存储转发。
seq_cst 强制存储缓冲区在 seq_cst 加载可以从同一线程重新加载 seq_cst 存储之前耗尽。 (或者在 seq_cst 加载可以读取缓存之前,如果它不是最近存储的重新加载。)当 seq_cst 加载从缓存读取值时,该核心不能有任何正在进行的 seq_cst 存储;它们必须都是全局可见的。
这是 https://preshing.com/20120515/memory-reordering-caught-in-the-act/ 的区别 - 在存储和重新加载之间添加完整的内存屏障是需要的(在 x86 上)从 acq_rel 到 seq_cst。