c - while(!volatile); 是做什么的?做?

标签 c volatile

我在同事代码中从未调用过的部分中看到了这一点:

volatile unsigned char vol_flag = 0;
// ...
while(!vol_flag);

vol_flag 在头文件中声明,但从未更改。我是否正确认为这会导致程序陷入无限循环?有什么办法吗?

最佳答案

通常这样的代码表示 vol_flag 预计会在某个时候外部更改。在这里,externally 可能意味着一个不同的线程、一个中断处理程序、一个硬件(在内存映射 IO 的情况下)等。这个循环有效地等待改变标志的外部事件。

volatile 关键字是程序员表达这样一个事实的一种方式,即假设代码中显而易见的内容是不安全的:即标志在循环中未更改。因此,它可以防止编译器进行可能损害代码背后意图的优化。相反,编译器被迫进行内存引用以获取标志的值。

请注意(与 Java 不同)C/C++ 中的 volatile 不建立happens-before 关系,并且不保证 volatile 访问中内存引用的任何顺序或可见性.此外,它不确保变量引用的原子性。因此,它不是线程间通信的工具。参见 this了解详情。

关于c - while(!volatile); 是做什么的?做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10546804/

相关文章:

直接调用函数比通过 bash 脚本调用它花费更多的时间

c - 如何修复代码中系统调用 Ntcreateprocess 原型(prototype)的 undefined symbol ?

c++ - 当编译器看不到可以完成转换的可能类型时,是否允许编译器优化 volatile 指针的 dynamic_cast?

java - 不稳定的使用会降低性能吗

Java:没有 volatile 变量就关闭?

C - volatile 指针的使用

c - 为什么在 C 中将\0 定义为 char 数组的第一个元素?

c - 动画窗口图标

c - 看门狗:设备或资源忙

c - 编译器可能不会跨序列点移动对 volatile 变量的访问;这是什么意思?