1

我很难理解std::atomic_ref<int>with的正确用法volatile

天真地存在三种可能性:

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

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

4

1 回答 1

3

不像std::atomic<T>,std::atomic_ref<T>没有volatile-qualified 方法。因此,您可能无法对 a 做太多事情volatile std::atomic_ref<T>(无论 T 本身是否易变)。

鉴于报价,这是有道理的

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

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

所以你要

std::atomic_ref<volatile int>

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

依靠std::atomic这种方式至少是不可移植的。具体来说,这个答案及其链接的论文提到了一些std::atomic可能不充分的方式 - 您可以检查这些是否是您的实际问题。

于 2020-09-23T11:35:08.930 回答