在C ++中的单线程应用程序中,volatile是否有用?

时间:2016-02-04 10:30:01

标签: c++ volatile single-threaded

与标题一样 - 是否有volatile在单线程编程环境中有用的情况?我知道它用于确保变量的值总是在内存中实际检查,因此在任何情况下,该值可能会以app / compiler赢得的方式改变(在ST应用程序中)#39 ;注意?

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

编辑:正如我所指出的那样,这个问题与语言无关。我是否特定于C ++(我已经读过C ++版本也存在差异,但我希望它们不足以让这个问题过于宽泛)。

3 个答案:

答案 0 :(得分:4)

这是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 is even not recommended for multi-threaded use

答案 1 :(得分:3)

其他答案已经解决了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变量,这样我就不必一直打到断点:我可以打一次,设置它,然后它会“记住”我的选择

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

答案 2 :(得分:1)

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

P.S。答案或多或少是通用的,可能不正确,这取决于语言,如上所述。