std::atomic<T> 上的 volatile 操作的用例是什么?

What's the usecase of volatile operations on std::atomic<T>?

关于 volatile 在多线程代码中的有用性存在很多争论。大多数人都同意,volatile 的主要用例主要用于裸机应用程序,例如设备驱动程序和中断处理程序,而不是使内置类型的变量成为线程安全的。事实上,volatile 也因此导致了很多混乱。

但是,它已被添加到 std::atomic<T> 类型的函数重载中,这表明它有一个用例。这些操作的用例是什么?

从某种意义上说,volatile 有一个普遍用途,即编译器不得优化对该变量的访问。然而,在这种情况下,我认为这主要是因为输入可能是 volatile - 就像 const 的情况一样,你可以 "add" 但不能 "remove" volatile 属性传递给参数。

因此:

int foo(volatile int *a)
{
    ... 
}

将接受:

int x;
volatile int y;

foo(&x);
foo(&y);

如果您没有写 volatile,编译器应该不会接受 foo(&y); 变体。