我在一个从未在同事的代码中调用的部分中看到了这一点:
volatile unsigned char vol_flag = 0;
// ...
while(!vol_flag);
vol_flag
在头文件中声明,但永远不会更改。我是否正确,这会导致程序无限循环?有没有办法摆脱它?
答案 0 :(得分:16)
通常这样的代码表示vol_flag
预计会在某个时刻更改外部。这里,外部可能意味着一个不同的线程,一个中断处理程序,一个硬件(在内存映射IO的情况下)等。这个循环有效地等待改变标志的外部事件。
volatile
关键字是程序员表达以下事实的一种方式:假设代码中显而易见的是不安全的:即循环中的标志没有改变。因此,它阻止编译器进行可能损害代码背后意图的优化。相反,编译器被强制进行内存引用以获取标志的值。
请注意(与Java不同)C / C ++中的volatile
不会建立发生在之前的关系,并且不保证在易失性访问中对内存引用进行任何排序或可见性。而且,它不能确保变量引用的原子性。因此,它不是线程之间通信的工具。有关详细信息,请参阅this。