如果有两个线程访问全局变量,那么许多教程都说使变量volatile变为阻止编译器将变量缓存在寄存器中,从而无法正确更新.但是,访问共享变量的两个线程是通过互斥锁来调用保护的东西不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有那个线程可以访问变量,在这种情况下变量不需要是volatile?
那么多线程程序中volatile的用途/目的是什么?
我知道当从几个线程或进程写入的内存位置读取时,volatile属性应该用于该位置,就像下面的一些情况一样,但我想知道更多关于它对编译器的实际限制,基本上是什么规则编译器在处理这种情况时必须遵循,并且有任何例外情况,尽管可以同时访问存储器位置,但程序员可以忽略volatile关键字.
volatile SomeType * ptr = someAddress;
void someFunc(volatile const SomeType & input){
//function body
}
Run Code Online (Sandbox Code Playgroud) 我最近提出了一个关于使用volatile的问题,并被指示阅读英特尔和其他人讨论内存障碍及其用途的一些非常有用的文章.看完这些文章后,我变得非常偏执.
我有一台64位机器.从多个线程记忆到相邻的,非重叠的内存区域是否安全?例如,假设我有一个缓冲区:
char buff[10];
Run Code Online (Sandbox Code Playgroud)
一个线程是否总是安全地记忆到前5个字节,而第二个线程复制到最后5个字节?
我的直觉反应(和一些简单的测试)表明这是完全安全的,但我无法在任何可以完全说服我的文件中找到文档.