簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM