6

以前,使用 Apple LLVM 9.1.0,128is_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()返回错误。

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

4

1 回答 1

3

自己在这里找到了答案。

gcc7 及更高版本将调用 libatomic 而不是 inlining lock cmpxchg16b,并将返回 false atomic_is_lock_free原因包括它太慢了,这不是用户期望is_lock_free的意思),但至少目前 libatomic 实现仍然lock cmpxchg16b在该指令可用的目标上使用。(它甚至可以对只读原子对象进行段错误,所以它真的不理想。)

于 2018-04-13T14:26:45.563 回答