Fro*_*art 2 c++ multithreading volatile
我刚刚阅读过不要使用volatile作为 CERT站点上的同步原语文章,并注意到编译器理论上可以优化以下代码,方法是将flag变量存储在寄存器中,而不是修改不同线程之间共享的实际内存:
bool flag = false;//Not declaring as {{volatile}} is wrong. But even by declaring {{volatile}} this code is still erroneous
void test() {
while (!flag) {
Sleep(1000); // sleeps for 1000 milliseconds
}
}
void Wakeup() {
flag = true;
}
void debit(int amount){
test();
account_balance -= amount;//We think it is safe to go inside the critical section
}
Run Code Online (Sandbox Code Playgroud)
我对吗?
我是否需要为volatile程序中的每个对象使用关键字来共享不同线程之间的内存?不是因为它为我做了某种同步(我需要使用互斥或任何其他同步原语来完成这样的任务)但仅仅因为编译器可能优化我的代码并将所有共享变量存储在寄存器中其他线程永远不会获得更新值?
它不仅仅是将它们存储在寄存器中,共享主存储器和CPU之间存在各种级别的缓存.大部分缓存都是针对每个CPU核心进行的,因此其他核心长时间不会看到任何更改(或者如果其他核心正在修改相同的内存,那么这些更改可能会完全丢失).
无法保证缓存的行为方式,即使对于当前处理器来说情况属实,对于旧处理器或下一代处理器来说也许不是这样.为了编写安全的多线程代码,您需要正确地执行它.最简单的方法是使用提供的库和工具.尝试使用像volatile这样的低级原语自己做这件事是非常困难的事情,涉及很多深入的知识.