升级到MacPorts gcc 7.3后,is_lock_free()返回false

时间:2018-04-13 12:20:14

标签: c++ gcc atomic lock-free gcc7

以前,使用Apple LLVM 9.1.0,128位结构上的is_lock_free()返回true。要获得完整的std::optional支持,我会升级到MacPorts gcc 7.3。在我第一次尝试编译时,我遇到了这个臭名昭着的showstopper链接器错误:

Undefined symbols for architecture x86_64:
  "___atomic_compare_exchange_16", referenced from:

我知道我可能需要添加-latomic。使用Apple LLVM 9.1.0,我不需要它,我对此非常不满意。如果它是无锁的,您通常不需要链接到任何其他库,单独的编译器就能够处理它。否则,它可能只是基于锁的,需要来自其他库的支持。正如我所担心的那样,在添加-latomic之后,构建成功,但is_lock_free()返回false。

我认为gcc 7.3及其标准库实现很好。这可能只是我身上的一些配置问题。事实上,我没有做任何配置。我只是安装了MacPorts gcc并完成了。知道我可能缺少什么吗?

1 个答案:

答案 0 :(得分:3)

自己找到答案here

  

gcc7及更高版本将调用libatomic而不是内联lock cmpxchg16b,并将从atomic_is_lock_freefor reasons including that it's so slow it's not what users expect is_lock_free to mean)返回false,但至少目前libatomic实现仍使用{{1}在该指令可用的目标上。 (它甚至可以对只读原子对象进行分段,因此它实际上并不理想。)