我在一个永远不会在同事代码中调用的部分中看到了这一点:
volatile unsigned char vol_flag = 0;
// ...
while(!vol_flag);vol_flag在头文件中声明,但永远不会更改。这会导致程序在无限循环中挂起,我说的对吗?有没有办法走出困境?
发布于 2012-05-11 14:58:22
通常,像这样的代码表明vol_flag应该在某个时候从外部进行更改。在这里,外部可能意味着不同的线程、中断处理程序、一块硬件(在内存映射IO的情况下)等。此循环有效地等待更改标志的外部事件。
volatile关键字是程序员表达以下事实的一种方式:假定代码中显而易见的内容是不安全的:即标志在循环中不会更改。因此,它可以防止编译器进行可能损害代码背后意图的优化。相反,编译器被强制进行内存引用以获取标志的值。
请注意(与Java语言不同) C/C++中的volatile不建立发生之前的关系,也不保证易失性访问中内存引用的任何排序或可见性。此外,它不能确保变量引用的原子性。因此,它不是用于线程之间通信的工具。详情请参见this。
https://stackoverflow.com/questions/10546804
复制相似问题