![](/img/trans.png)
[英]is_lock_free not defined in std::atomic<T> in gcc 4.7.2?
[英]is_lock_free() returned false after upgrading to MacPorts gcc 7.3
以前,使用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並完成了。 知道我可能缺少什么嗎?
在這里找到答案。
gcc7及更高版本將調用libatomic而不是內聯
lock cmpxchg16b
,並將從atomic_is_lock_free
返回false( 原因包括它的速度is_lock_free
,而不是用戶期望的is_lock_free
意思 ),但至少目前libatomic實現仍然在目標上使用lock cmpxchg16b
該指令可用的地方。 (它甚至可以對只讀原子對象進行分段,因此它實際上並不理想。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.