6

我在同事代码中从未调用过的部分中看到了这一点:

volatile unsigned char vol_flag = 0;
// ...
while(!vol_flag);

vol_flag在头文件中声明,但从不更改。我是否正确,这会导致程序陷入无限循环?有没有办法摆脱它?

4

1 回答 1

16

通常,这样的代码表示vol_flag预计会在某个时候在外部进行更改。在这里,外部可能意味着不同的线程、中断处理程序、硬件(在内存映射 IO 的情况下)等。此循环有效地等待更改标志的外部事件。

关键字是程序员表达这样一个事实的volatile一种方式,即假设从代码中显而易见的事实是不安全的:即标志在循环中没有改变。因此,它可以防止编译器进行可能损害代码背后意图的优化。相反,编译器被迫进行内存引用以获取标志的值。

请注意(与 Java 不同)volatile在 C/C++ 中不建立先发生关系,也不保证内存引用在 volatile 访问中的任何顺序或可见性。此外,它不能确保变量引用的原子性。因此,它不是线程间通信的工具。有关详细信息,请参阅

于 2012-05-11T06:58:22.423 回答