一切都很不稳定

bob*_*obo 3 c++ compiler-construction optimization volatile llvm

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

但问题是,由于第二个工作线程涉及各种对象,这意味着程序中几乎所有东西都是易变的.

我不知道是否有一种方法来关闭优化在苹果LLVM编译器,创造了该漏洞volatile的关键字是专门设计来解决.这些错误不会出现在调试模式下(因为优化已关闭).放在volatile任何地方基本上意味着volatile每个成员函数之后加入每个类,并volatile在每个共享变量声明之前添加.

我想我宁愿失去volatile优化而不是冒险出现虚假的错误因为我忘了标记某些东西volatile.

Mik*_*our 7

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

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