c++ - is_lock_free() 在升级到 MacPorts gcc 7.3 后返回 false

标签 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 并完成了。知道我可能遗漏了什么吗?

最佳答案

自己找到答案here .

gcc7 and later will call libatomic instead of inlining lock cmpxchg16b, and will return false from atomic_is_lock_free (for reasons including that it's so slow it's not what users expect is_lock_free to mean), but at least for now the libatomic implementation still uses lock cmpxchg16b on targets where that instruction is available. (It can even segfault for read-only atomic objects, so it's really not ideal.)

关于c++ - is_lock_free() 在升级到 MacPorts gcc 7.3 后返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49816855/

相关文章:

c - 如何查找给定地址是在堆中还是在堆栈中

使用简写 IF 优化 C++ 编译器

c++ - 获取/释放与顺序一致的内存顺序

c++ - SSE 内在函数复制寄存器中的字节

c++ - 如何传递私有(private) map 并输入数据

c++ - 模板类静态成员的初始化

java - 什么是原子?

c++ - 使用 std::atomic 实现无锁结构,Dtor 崩溃

返回时更改 double 的 C++ 值

c++ - std::byte 定义明确吗?