【发布时间】:2013-08-10 16:51:39
【问题描述】:
我有一个变量int foo,可以从两个线程访问。假设我没有竞争条件问题(访问受互斥锁保护,所有操作都是原子的,或者任何其他保护竞争条件的方法),仍然存在“寄存器缓存”问题(因为没有更好的名称) ,其中编译器可能会假设如果变量被读取两次而没有在其间写入,则它是相同的值,因此可能会“优化”掉以下内容:
while(foo) { // <-may be optimized to if(foo) while(1)
do-something-that-doesn't-involve-foo;
}
或
if(foo) // becomes something like (my assembly is very rusty): mov ebx, [foo]; cmp ebx, 0; jz label;
do-something-that-doesn't-involve-foo;
do-something-else-that-doesn't-involve-foo;
if(foo) // <-may be optimized to jz label2;
do-something;
将foo 标记为volatile 是否可以解决此问题?是否保证来自一个线程的更改会到达另一个线程?
如果没有,还有什么其他方法可以做到这一点?我需要 Linux/Windows 的解决方案(可能是单独的解决方案),没有 C++11。
【问题讨论】:
-
我记得看到标准中的一句话说你不应该再在线程中使用 volatile,在 c++ 中,我会尝试找到它
-
这里的问题是“假设我没有竞争条件问题”。这是一个巨大的假设。
-
std::atomic<int>不做你想做的事吗? -
我一直使用 volatile 来确保没有完成“寄存器缓存”,并且它始终有效。
标签: c++ c multithreading volatile