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