C++ 在使用libstdc+调试期间强制使用std::atomic内部的锁+;

C++ 在使用libstdc+调试期间强制使用std::atomic内部的锁+;,c++,multithreading,c++11,atomic,libstdc++,C++,Multithreading,C++11,Atomic,Libstdc++,我在谷歌上做了一些工作,但似乎无法为此打开GCC选项或libstdc++宏。是否可以在所有std::atomic模板专门化上强制使用内部锁定。在某些平台上,一些专门化无论如何都是锁定的,因此这看起来确实是一个可行的选择 在过去,我发现使用std::atomic在使用Valgrind(Helgrind或DRD)等工具调试数据竞争时非常痛苦,因为存在大量误报。如果原子的使用足够普遍,那么抑制文件似乎不是一个非常可扩展的解决方案。没有办法,好吧。GCC通过无锁内置函数(\uuuuuuu-atomic\

我在谷歌上做了一些工作,但似乎无法为此打开GCC选项或libstdc++宏。是否可以在所有
std::atomic
模板专门化上强制使用内部锁定。在某些平台上,一些专门化无论如何都是锁定的,因此这看起来确实是一个可行的选择


在过去,我发现使用
std::atomic
在使用ValgrindHelgrindDRD)等工具调试数据竞争时非常痛苦,因为存在大量误报。如果原子的使用足够普遍,那么抑制文件似乎不是一个非常可扩展的解决方案。

没有办法,好吧。GCC通过无锁内置函数(
\uuuuuuu-atomic\u-fetch\u-add
\uuuuu-atomic\u-test\u和uu-set
等)实现C++11原子。根据机器定义中的可用内容,GCC可能会发出一些有效的insn序列,或者作为最后手段,使用比较和交换循环。如果没有任何有用的功能可用,GCC只会使用相同的名称和参数调用外部函数


实际上,您可以使用
-m32-march=i386
进行编译,并为自己提供所需的外部函数。

也许您可以试试ThreadSanitarizer之类的工具。有两种实现:我的印象是ThreadSanitizer也无法区分原子和竞争条件?我不确定Valgrind版本,但llvm中的tsan通过调用tsan函数替换IR中的原子指令来处理原子。见幻灯片25