首页 > 解决方案 > C++ 标准中的栅栏定义 [n4713 中的 atomics.fences]

问题描述

[atomics.fences.2]:

如果存在原子操作 X 和 Y,则释放栅栏 A 与获取栅栏 B 同步,两者都对某个原子对象 M 进行操作,使得 A 在 X 之前排序,X 修改 M,Y 在 B 之前排序,并且 Y 读取值由 X 写入或由假设的释放序列中的任何副作用写入的值 X 将在它是一个释放操作时开始。

所以一个潜在的示例代码是这样的:

std::atomic<uint32_t> M;

//Thread K
std::atomic_thread_fence(std::memory_order::release);  // release fence A sequenced before
M.store(1, std::memory_order::relaxed); // operation X: operating on atomic object M

//Thread J
M.load(std::memory_order::relaxed); // operation Y: operating on atomic object M -- reading sequenced before
std::atomic_thread_fence(std::memory_order::acquire); // acquire fence B

问题:

  1. 上面的代码是否反映了 [atomics.fences.2] 所说的内容?如果不是,它应该是什么样子?

  2. 我认为释放栅栏应该在操作 X 之后排序,因为释放栅栏试图使之前的存储对于获取栅栏(B)的其他线程可见,因此获取栅栏 B 应该在操作 Y 之前排序。不是吗?

标签: c++c++11c++17memory-barriers

解决方案


推荐阅读