一切都很不稳定

时间:2013-08-16 15:07:08

标签: c++ compiler-construction llvm volatile optimization

我正在创建这个多线程C ++程序,并且在发布模式下进行编译时,我发现了排序错误(对象仍然为空),即它看起来像缺少volatile个标记

但问题是,由于第二个工作线程涉及各种对象,这意味着程序中几乎一切都不稳定

我想知道是否有办法关闭Apple LLVM编译器中的优化,以创建 volatile关键字专门设计修复的错误。这些错误不会出现在调试模式下(因为优化已关闭)。将volatile放在任何地方基本上意味着在每个成员函数之后使用volatile为每个类加工,并在每个共享变量声明之前添加volatile

我认为我宁愿失去volatile优化而不是冒险出现虚假错误,因为我忘了标记某些内容volatile

1 个答案:

答案 0 :(得分:7)

在C ++中,volatile与线程安全无关。你不能依赖它来避免数据竞争。其目的是强制同步访问变量(从单个线程,或使用其他机制彼此同步的线程),以完全按指定的顺序发生。在与硬件交互时,这通常是必要的,以防止看起来什么都不做但实际上影响硬件状态的访问被优化掉。它不保证非同步访问的效果。

要避免数据争用,必须使用原子操作或显式锁来同步对共享对象的访问。 C ++ 11在标准库中提供了这些;如果您遇到过去,那么您将不得不依赖于您的平台上可用的任何库(例如 pthreads )或语言扩展(例如原子内在函数)。