可能重复:
C++:什么时候有挥发性关键字帮你?
我从来没有用过它,但我想知道为什么人们会用它?它到底是做什么的?我搜索了论坛,发现它只是C#或Java主题.
考虑以下:
volatile uint32_t i;
Run Code Online (Sandbox Code Playgroud)
我如何知道gcc是否确实将我视为易变?它会被声明为因为没有附近的代码会修改它,并且修改它可能是由于某些中断.
我不是世界上最差的汇编程序员,但我在电视上播放一个.有人可以帮我理解它会有什么不同吗?
如果你采取以下愚蠢的代码:
#include <stdio.h>
#include <inttypes.h>
volatile uint32_t i;
int main(void)
{
if (i == 64738)
return 0;
else
return 1;
}
Run Code Online (Sandbox Code Playgroud)
将其编译为对象格式并通过objdump反汇编,然后在删除'volatile'后执行相同操作,没有区别(根据diff).volatile声明是否太接近于其检查或修改的位置,或者我在声明易失性时应该总是使用某种原子类型?一些优化标志会影响这个吗?
请注意,我的愚蠢样本并不完全符合我的问题,我意识到这一点.我只是试图找出gcc是否确实将变量视为易失性,所以我正在研究小型转储以试图找到差异.
我读过这个和这个答案.我还搜索了C++ Concurrency in Action一书,但没有找到任何关于volatile使用它的例子的讨论.看起来它根本不是为并发而设计的.那么对于并发编程,只使用原子,互斥等就足够了,忘了volatile吗?volatile并发问题可能需要的任何情况?