我很难理解std::atomic_ref<int>
和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
限定的方法。因此,您可能无法对volatile std::atomic_ref<T>
做太多操作(无论t本身是否易失性(。
考虑到的报价,这是有道理的
与语言引用一样,atomic_ref的constness很浅-可以通过const atomic_rev对象修改引用的值。
假设cv资格在某种程度上是一致的,那么浅波动的atomic_ref不太可能有用,而且绝对不是你想要的。
所以,你想要
std::atomic_ref<volatile int>
请注意,仅使用std::atomic_ref<int>
就足够了,但由于该标准没有对MMIO做出任何明确的保证,您可能应该查阅编译器文档和/或检查它生成的代码。
以这种方式依赖std::atomic
至少是不可移植的。具体来说,这个答案及其链接的论文提到了std::atomic
可能不足的一些方面——你可以检查这些是否是你的实际问题。