我很难理解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。
我很难理解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。
不像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
可能不充分的方式 - 您可以检查这些是否是您的实际问题。