C 当(!volatile)时会发生什么;做
我在一个从未在同事代码中调用的部分中看到了这一点:C 当(!volatile)时会发生什么;做,c,volatile,C,Volatile,我在一个从未在同事代码中调用的部分中看到了这一点: volatile unsigned char vol_flag = 0; // ... while(!vol_flag); vol_标志在头文件中声明,但从未更改。这会导致程序挂起在一个无限循环中,对吗?有办法解决吗?通常,这样的代码表示希望在某个时候从外部更改vol_flag。在这里,外部可能意味着不同的线程、中断处理程序、硬件(在内存映射IO的情况下)等。此循环有效地等待更改标志的外部事件 volatile关键字是程序员表达这样一个事实的
volatile unsigned char vol_flag = 0;
// ...
while(!vol_flag);
vol_标志
在头文件中声明,但从未更改。这会导致程序挂起在一个无限循环中,对吗?有办法解决吗?通常,这样的代码表示希望在某个时候从外部更改vol_flag
。在这里,外部可能意味着不同的线程、中断处理程序、硬件(在内存映射IO的情况下)等。此循环有效地等待更改标志的外部事件
volatile
关键字是程序员表达这样一个事实的一种方式,即假设代码中明显的内容是不安全的:即循环中的标志没有更改。因此,它可以防止编译器进行可能损害代码背后意图的优化。相反,编译器被迫进行内存引用以获取标志的值
请注意(与Java不同)
volatile
在C/C++中不建立before关系,也不保证在volatile访问中内存引用的任何顺序或可见性。此外,它不能确保变量引用的原子性。因此,它不是线程间通信的工具。有关详细信息,请参阅。它看起来像是多线程代码中的一些制作拙劣的旋转锁。类似的代码通常在微控制器的程序中找到。@alexander它确实适用于微控制器。我想,正如亚当所暗示的,它应该在某个地方的中断例程中发生变化。