在C++的单线程应用程序中完全有用
Is volatile useful at all in a singlethreaded application in C++?
就像标题所说的那样 - 在单线程编程的上下文中,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
。
附言答案或多或少是通用的,并且可能不正确,具体取决于上面已经提到的语言。
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如果我在 Xbox UWP 应用程序上收到激活错误并且错误消息中没有任何有用的内容,该怎么办
- 在C++的单线程应用程序中完全有用