gpt4 book ai didi

c++ - load-acquire 应该立即看到 store-release 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:09 26 4
gpt4 key购买 nike

假设我们有一个简单的变量(std::atomic<int> var)和 2 个线程 T1T2我们有以下代码 T1 :

...
var.store(2, mem_order);
...

T2

...
var.load(mem_order)
...

我们还假设 T2 (load) 执行时间比 T1 晚 123ns (按照 C++ 标准的修改顺序) (店铺)。我对这种情况的理解如下(针对不同的内存顺序):

  1. memory_order_seq_cst - T2 load 有义务加载2 .如此有效,它必须加载最新值(就像 RMW 操作的情况一样)
  2. memory_order_acquire/memory_order_release/memory_order_relaxed - T2没有义务加载 2但可以加载任何具有唯一限制的旧值:该值不应早于该线程最新加载的值。所以,例如 var.load返回 0 .

我的理解正确吗?

更新 1:

如果我的推理有误,请提供证明它的 C++ 标准文本。不仅仅是一些架构可能如何工作的理论推理。

最佳答案

Am I right with my understanding?

没有。您误解了内存顺序。

let's assume that T2(load) executes 123ns later than T1(store)...

在这种情况下,T2 将看到 T1 对任何类型的内存顺序执行的操作(此外,此属性适用于任何内存区域的读/写,请参见例如 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4431.pdf , 1.10, p.15)。您的短语中的关键词是后来:这意味着其他人强制对这些操作进行排序。

内存顺序用于其他场景:

让一些操作OP1在存储操作之前进入线程T1OP2在它之后,OP3来在加载操作之前的线程 T2 中,OP4 紧随其后。

//T1:                         //T2:
OP1 OP3
var.store(2, mem_order) var.load(mem_order)
OP2 OP4

假设,线程可以观察到 var.store()var.load() 之间的某种顺序。关于其他操作的跨线程顺序,有什么可以保证的?

  1. 如果var.store使用memory_order_releasevar.load使用memory_order_acquirevar.store 被排序在之前 var.load(即load返回2),那么OP1的效果被排序在之前 OP4

例如,如果 OP1 写入一些变量 var1,OP4 读取该变量,那么可以确定 OP4 将读取什么 OP1 写在前面。这是最常用的情况。

  1. 如果 var.storevar.load 使用 memory_order_seq_cst 并且 var.store 是有序的 after var.load(即加载返回0,这是store之前变量的值),然后OP2的效果在之后排序 OP3

某些棘手的同步方案需要此内存顺序。

  1. 如果 var.storevar.load 使用 memory_order_relaxed,则 var.store 的任意顺序> 和 var.load 可以保证跨线程操作的无顺序

其他人确保操作顺序时,使用此内存顺序。例如,如果线程 T2 创建在 T1 中的 var.store 之后,则 OP3OP4 排在 OP1 之后。

更新:123 ns later 意味着*someone else* force ordering 因为计算机的处理器没有关于世界时的概念,并且没有操作执行时的精确时刻。要测量两次操作之间的时间,您应该:

  1. 一些 cpu 上观察完成第一个操作和开始计时操作之间的顺序。
  2. 观察开始和结束时间计算操作之间的顺序。
  3. 遵守完成计时操作和开始第二个操作之间的顺序。

传递性地,这些步骤在第一个操作和第二个操作之间进行排序。

关于c++ - load-acquire 应该立即看到 store-release 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30779181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com