以前,使用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并完成了。知道我可能缺少什么吗?
答案 0 :(得分:3)
自己找到答案here。
gcc7及更高版本将调用libatomic而不是内联
lock cmpxchg16b
,并将从atomic_is_lock_free
(for reasons including that it's so slow it's not what users expectis_lock_free
to mean)返回false,但至少目前libatomic实现仍使用{{1}在该指令可用的目标上。 (它甚至可以对只读原子对象进行分段,因此它实际上并不理想。)