我正在使用gcc 4.4.6并且#include <cstdatomic>
可以访问atomics。使用它们后,我意识到它们非常慢。最后,我遇到了一个关于stackoverflow的帖子,它在这里描述了Why is std::atomic<bool> much slower than volatile bool?
但我无法遵循它。有人可以帮我理解这个帖子或解释为什么gcc4.4.6中的原子是如此之慢?
答案 0 :(得分:2)
我相信gcc-4.4在支持原子方面非常早。 gcc中的原子最近在gcc-4.7中进行了重新设计。我相信这是第一个版本,其中不同的硬件目标能够使用特定于硬件的高效内置函数。在gcc-4.8中提供了一个libatomic。在4.7和4.8的过程中,各种平台都升级了他们的原子支持。 wiki解释了使用原子时各种内存模型的一些优化权衡。
基本上,gcc-4.4有点早。 IIRC甚至原子的标准规范也在通过gcc-4.7。
答案 1 :(得分:0)
我已经使用了4.6.3中的__sync_*
函数,并没有注意到任何明显的缓慢,生成的汇编代码也没有显示任何不适当的东西。我刚刚更新了我曾经使用__sync_fetch_and_add
使用std::atomic<>::fetch_add()
的项目 - 虽然它不经常调用原子函数,但我的代码完全没有差别 - 在单线程或多线程运行中的代码。所以我同意之前的回答:获得一个更新的gcc
,它应该自行解决。