3

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

但问题是,由于有第二个工作线程接触各种对象,这意味着程序中几乎所有内容都是易变的。

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

我想我宁愿失去那个volatile优化也不愿冒着出现虚假错误的风险,因为我忘了标记一些东西volatile

4

1 回答 1

7

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

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

于 2013-08-16T15:24:51.517 回答