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