顺序一致性和获取/释放语义之间有什么区别?

时间:2019-12-12 18:29:09

标签: c++ multithreading lock-free memory-barriers stdatomic

据我所知,获取/释放语义充当顺序一致性和较弱的内存模型(或C ++称为“松弛”)所允许的无条件内存重新排序自由之间的中间地带。简而言之:

  • 获取语义可防止read进行任何以程序顺序跟在其后的readwrite操作的内存重新排序;
  • 发布语义可防止write进行任何以程序顺序在其前面的readwrite操作进行内存重新排序。

很酷。但是这些保证加在一起,对我来说似乎是连续的一致性。顺序一致性提供了什么却不能使获取/释放语义共同提供?你能举个例子吗?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

用硬件术语来说,acq / rel允许在一个线程内进行存储/重装,以便在其他线程全局可见之前,将存储缓冲区中的值转发给存储缓冲区。

seq_cst强制先清空存储缓冲区,然后seq-cst加载才能从同一线程重新加载seq-cst存储。

这是https://preshing.com/20120515/memory-reordering-caught-in-the-act/的区别-从acq_rel到seq_cst,需要在存储和重载之间添加完整的内存屏障(在x86上)。