这种用法是不是很好吗?

时间:2012-03-21 15:41:00

标签: c gcc compiler-construction compiler-optimization volatile

假设我在这样的循环中检查变量。

while( var )
  ;

如果程序是多线程的并且多个线程访问 var ,则必须声明 var volatile。这是一个众所周知的事实。但是,让我们说,我们有类似的东西。

while( var + 1 )
  ;

这仍然适用于volatile吗?我的意思是编译器可能缓存(var + 1)的值吗?换句话说,我问我们是否需要对此进行编码,其中 temp 也是一个volatile变量,以确保编译器不会进行缓存。

while( temp )
  temp = var + 1;

2 个答案:

答案 0 :(得分:5)

我可以补充说,使用volatile作为你的线程保护来检查这样的var并不足以防止发生各种各样的竞争条件。如果您处于线程环境中,请使用正确的锁,原子和/或互斥结构来抓取和操纵您的变量。

答案 1 :(得分:3)

从编译器的角度来看,它是一回事。访问时,必须始终从内存中重新读取volatile变量。评估varvar + 1都涉及访问var,因此两者都必须重新阅读。没有区别。