在C++的单线程应用程序中完全有用

Is volatile useful at all in a singlethreaded application in C++?

本文关键字:有用 应用程序 C++ 单线程      更新时间:2023-10-16

就像标题所说的那样 - 在单线程编程的上下文中,volatile是否有任何情况是有用的?我知道它用于确保变量的值始终在内存中实际检查,那么是否有任何情况可能会以应用程序/编译器不会注意到的方式更改该值(在 ST 应用程序中)?

我将这个问题留在语言无关,因为我不知道它们之间有任何差异会影响这个问题的答案。但如果有,请告诉我。

编辑:正如有人向我指出的那样,这个问题与语言无关。然后我把它C++具体(我读到C++版本也有差异,但我希望它们不够大,无法使这个问题太宽泛)。

这是

C和C++的答案

是的!当变量映射到硬件寄存器(例如 I/O 设备)时。硬件修改寄存器,独立于应用程序。

例:

extern volatile uint32_t MY_DEVICE_START; // write-only register
extern volatile const uint32_t MY_DEVICE_STATUS; // read-only register
extern volatile uint32_t MY_DEVICE_DATA; // read-write register
...
MY_DEVICE_DATA = 42; // send input to the device
MY_DEVICE_START = 1; // start the device
while (MY_DEVICE_STATUS == 0) {} // busy-wait for the device to finish
int result = MY_DEVICE_DATA; // read output from the device
...

至少在C/C++中,这是它的主要原因。甚至不建议将易失性用于多线程使用。

其他答案已经解决了volatile是什么,但我想给出一个真实世界的例子,当volatile有用时我使用(无需尝试读取/写入特殊的硬件内存位置)。

volatile在 C 或 C++ 程序中有用的一个示例是用于调试。请考虑以下示例:

void do_thing(const std::vector<int>& v) {
    if (v.empty()) {
        do_thing_1();
    } else {
        do_thing_2();
    }
}

如果我想测试上述函数并在调试时强制它采用 true 或 false 分支,我可以在 if 条件中插入一个 volatile 变量:

void do_thing(const std::vector<int>& v) {
    volatile bool condition = v.empty();
    if (condition) {
        do_thing_1();
    } else {
        do_thing_2();
    }
}

我把它volatile,所以优化器不会完全优化变量。这使得在if上设置断点变得简单,然后我可以修改condition(无需修改v)。

我还可以将condition设置为static变量,这样我就不必一直命中断点:我可以点击一次,设置它,然后它会"记住"我的选择。

当然,这是一个黑客,但我发现它在某些特定情况下非常有用。

线程程序也可以有信号处理,甚至在非多线程平台上也可以使用硬件中断处理,所以在处理程序函数中修改的非局部变量应该声明为volatile

附言答案或多或少是通用的,并且可能不正确,具体取决于上面已经提到的语言。