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);
变体。
关于 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);
变体。