【发布时间】:2020-11-14 00:20:20
【问题描述】:
遗憾的是,我被 C++98 卡住了,我在嵌入式应用程序中使用它。
我的问题是:我有一个多线程应用程序,具有各种全局共享变量(邪恶,我知道)。 我确实使用互斥锁保护对它们的每次访问。我是否还需要将这些全局变量声明为 volatile,以防止编译器优化对它们的访问?
网上搜了一下,好像volatile对于多线程是绝对没用的,但是很多文章都是和C++11相关的,里面确实介绍了一个识别线程的内存模型,但是我是在C++98的地盘。 我还发现了一些资源表明 volatile 在我的情况下反而有用,例如 this Barr Group's article。
让我强调一个事实,即我根本不想摆脱互斥锁,或者尝试无锁编程。互斥锁绝对保留,我只是想了解是否需要 volatile 关键字。
【问题讨论】:
-
使用互斥锁。 volatile 不能保护您免受竞争条件的影响
-
@bobra 我对他们问题的解读是他们理解这一点。
-
我担心的不是竞态条件,而是编译器优化。
-
stackoverflow.com/questions/50951011/… 表示互斥锁可以保护您免受 cpu 重新排序,而stackoverflow.com/questions/11172922/… 弱建议您可以避免编译器重新排序。
-
@fraben 编译器并没有你想象的那么糟糕:D volatile 强制你的程序在内存中读/写这个变量,而不是使用 cpu 缓存。
标签: multithreading volatile c++98