【问题标题】:Memory ordering or read-modify-write operation with (read/write)-only memory order仅具有(读/写)内存顺序的内存排序或读-修改-写操作
【发布时间】:2018-08-23 04:57:00
【问题描述】:

执行以下是原子RMW操作

auto value = atomic.fetch_or(value, order);

orderstd::memory_order_acq_rel 时,我们知道原子中先前值的加载将获取之前可能在同一个原子上发生的任何释放操作。并且写入将释放当前线程对获取相同原子变量的线程的写入。与std::memory_order_seq_cst 相同。

但是当您使用std::memory_order_acquire 时,RMW 操作的写入部分在内存排序方面的预期行为是什么?同样,在 RMW 操作的负载端使用 std::memory_order_release 的预期行为是什么?

【问题讨论】:

  • 它具有order 指定的语义,如果您要问的话,这并不奇怪。
  • @PasserBy memory_order_release 为读取操作指定了什么?当使用memory_order_release 时,RMW 操作的读取端会发生什么情况?
  • 没什么,但fetch_or 也算作写入。
  • @PasserBy 当然,但是如果我将原子中的前一个值用于某些逻辑。我可以假设当前线程已与任何其他发布操作同步吗?还是阅读轻松?
  • fetch_or一个操作,不是单独的读写。如果恰好在某处发生了获取,则具有释放语义的fetch_or 将与稍后读取的内容同步。

标签: c++ concurrency synchronization atomic memory-barriers


【解决方案1】:

在原子 RMW 上使用 std::memory_order_acquire 是仅获取操作。
由于它不会“释放”任何东西,因此它不能成为与稍后发生的另一个原子获取操作(在同一个原子变量上)的同步关系的一部分。
因此,store部分的等价物是std::memory_order_relaxed

在 RMW 上使用 std::memory_order_release 的类似原因。它不获取任何东西,因此负载部分的等效排序是“宽松的”

【讨论】:

  • @PasserBy 如果这意味着玩世不恭,那就换个地方吧
  • 嗯...愤世嫉俗怎么办?我说了什么?
猜你喜欢
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多