如果有两个线程访问全局变量,那么许多教程都说使变量volatile变为阻止编译器将变量缓存在寄存器中,从而无法正确更新.但是,访问共享变量的两个线程是通过互斥锁来调用保护的东西不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有那个线程可以访问变量,在这种情况下变量不需要是volatile?
那么多线程程序中volatile的用途/目的是什么?
class MyClass
{
int x, y;
void foo() volatile {
// do stuff with x
// do stuff with y
}
};
Run Code Online (Sandbox Code Playgroud)
我是否需要声明x并将其y视为volatile或将成为volatile自动处理的所有成员变量?
我想确保"stuff with x"不会y被编译器的"stuff with " 重新排序.
编辑:如果我将正常类型转换为volatile类型会发生什么?这是否会指示编译器不重新排序对该位置的访问?我想在特殊情况下将一个普通变量传递给一个参数是volatile的函数.我必须确保编译器不会使用先前或后续的读写重新排序该调用.
为什么c ++原子操作有一个volatile的重载版本atomic<T>?
我们atomic<T>什么时候需要声明为volatile,什么是atomic<T>和volatile atomic<T>?之间的区别?