【问题标题】:Correct usage of volatile with std::atomic_ref<T>使用 std::atomic_ref<T> 正确使用 volatile
【发布时间】:2020-09-23 11:14:49
【问题描述】:

我很难理解std::atomic_ref&lt;int&gt;volatile 的正确用法。

天真地有三种可能:

std::atomic_ref<volatile int> ref1;
volatile std::atomic_ref<int> ref2;
volatile std::atomic_ref<volatile int> ref3;

我们想在何时以及何时使用每一个?我感兴趣的用例是 MMIO。

【问题讨论】:

  • 你要解决什么问题?
  • 我有一个 mmap 结构,用作 IPC fifo。读取和写入都有顺序要求。我正在考虑依靠原子访问的std::memory_order 来实现内存屏障。
  • 如果该值是内存映射到硬件的,并且 所有 写入(即使是相同的写入)很重要,则需要 volatile,否则只需将 std::atomic_ref&lt;int&gt; ref2 与默认的memory_order::seq_cst 应该足以保证订购。
  • @rustyx 你所说的相同写入是什么意思:写入相同的内存位置,还是将相同的值写入相同的内存位置?
  • @rustyx 我不确定我是否完全理解为什么我不需要volatile,因为从 mmap'd 结构中读取会告诉我当前的 fifo 容量。

标签: c++ atomic volatile mmap atomicreference


【解决方案1】:

std::atomic&lt;T&gt; 不同,std::atomic_ref&lt;T&gt; 没有volatile 限定的方法。因此,您可能无法对 volatile std::atomic_ref&lt;T&gt; 做太多事情(无论 T 本身是否易变)。

考虑到quote,这是有道理的

与语言引用一样,atomic_ref 的常量性很浅 - 可以通过 const atomic_ref 对象修改引用的值。

假设 cv-qualification 有点一致,浅易失的 atomic_ref 不太可能有用,而且绝对不是您想要的。

所以,你想要

std::atomic_ref<volatile int>

请注意,可能仅使用 std::atomic_ref&lt;int&gt; 就足够了,但由于该标准没有对 MMIO 做出任何明确的保证,您可能应该查阅编译器文档和/或检查代码它会生成。

以这种方式依赖std::atomic至少是不可移植的。具体来说,this answer 及其linked paper 提到了std::atomic 可能不足的一些方面 - 您可以检查这些是否是您的实际问题。

【讨论】:

  • 关于缺少 volatile 方法的优点,我没有注意到。我也倾向于std::atomic_ref&lt;volatile int&gt;。谢谢
猜你喜欢
  • 2021-11-25
  • 2012-01-19
  • 2022-01-23
  • 2016-12-13
  • 1970-01-01
  • 2021-06-21
  • 2016-08-03
  • 1970-01-01
  • 2023-02-16
相关资源
最近更新 更多