我知道在文件范围定义的
volatile
变量。不允许编译器对这些变量做出假设。它们几乎可以随时更改,并且编译器不得优化变量的读取。
现在我找到了这段代码
BOOL InstallHandler()
{
volatile BOOL b_bulk_erase = FALSE;
volatile BOOL b_test_read_write = FALSE;
volatile BOOL b_continue = TRUE;
...
if (b_test_read_write)
{
read();
write();
}
}
volatile
如何对应于堆栈的变量,即由一个线程拥有的变量?
编辑:
对于一个线程拥有的情况,我想表达该变量没有公开。该地址没有提供给其他任何东西。它不被任何其他线程使用。
好吧,我意识到了 volatile 的意图。
该函数是与硬件设备通信的设备驱动程序的一部分。正常操作期间不使用功能
read
和 write
。
但是,当开发人员在调试器中运行程序时,她可以在
if
子句中设置断点,并使用调试器更改变量。这将允许操纵执行并调用 read
和 write
。
volatile
抑制了可能的优化,因为 if
子句测试 const 表达式。如果没有 volatile
,整个 if
可能不会出现在代码中。
仅仅因为,虽然变量本身位于单个线程中,但没有什么可以阻止您将其地址提供给其他线程。因此无法预见的修改。