假设我在这样的循环中检查变量。
while( var )
;
如果程序是多线程的并且多个线程访问 var ,则必须声明 var volatile
。这是一个众所周知的事实。但是,让我们说,我们有类似的东西。
while( var + 1 )
;
这仍然适用于volatile
吗?我的意思是编译器可能缓存(var + 1)的值吗?换句话说,我问我们是否需要对此进行编码,其中 temp 也是一个volatile
变量,以确保编译器不会进行缓存。
while( temp )
temp = var + 1;
答案 0 :(得分:5)
我可以补充说,使用volatile
作为你的线程保护来检查这样的var并不足以防止发生各种各样的竞争条件。如果您处于线程环境中,请使用正确的锁,原子和/或互斥结构来抓取和操纵您的变量。
答案 1 :(得分:3)
从编译器的角度来看,它是一回事。访问时,必须始终从内存中重新读取volatile
变量。评估var
或var + 1
都涉及访问var
,因此两者都必须重新阅读。没有区别。