c – 一切都很不稳定

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

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

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

我想我宁愿失去那种不稳定的优化而不是冒险出现虚假的错误,因为我忘了标记一些不稳定的东西.

解决方法:

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

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

上一篇:在2018年编写LLVM遍——前言


下一篇:【TVM学习四】基于Arm平台编译TVM—LLVM OpenCL CUDA openblas