Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当(!volatile)时会发生什么;做_C_Volatile - Fatal编程技术网

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它确实适用于微控制器。我想,正如亚当所暗示的,它应该在某个地方的中断例程中发生变化。