正确使用带有 std::atomic_ref <T>的易失性



我很难理解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可能不足的一些方面——你可以检查这些是否是你的实际问题。

最新更新