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

问题描述 投票:0回答:2

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

  • 获取语义可防止
    read
    与按程序顺序跟随其后的任何
    read
    write
    操作进行内存重新排序;
  • 释放语义可防止
    write
    与程序顺序中位于其之前的任何
    read
    write
    操作进行内存重新排序。

酷。但这些保证结合在一起,对我来说看起来像是顺序一致性。顺序一致性提供了哪些获取/释放语义在一起所不能提供的功能?能举个例子吗?

c++ multithreading lock-free memory-barriers stdatomic
2个回答
3
投票

在硬件方面,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。


© www.soinside.com 2019 - 2024. All rights reserved.