![](/img/trans.png)
[英]C++: How can lock-free data structures be implemented in C++ if std::atomic_flag is the only lock-free atomic type?
[英]Does the C++ 11 standard guarantees that std::atomic<> is implemented as a lock-free operation?
我在一個交叉點,我試圖在基於互斥鎖的數據結構和無鎖(可能無等待)的數據結構之間選擇一個。
雖然挖掘得更深,但我沒有發現C ++ 11標准是否支持原子類型的無鎖操作,甚至對於像atomic_uint32_t
這樣的基於寬度的積分也atomic_uint32_t
。 換句話說,不僅僅是std::atomic<>
接口沒有被授予無鎖; 在整個標准庫中,唯一看起來被授予無鎖的東西是std::atomic_flag
。
這是真的還是我遺失了什么? 這是什么原因? 我的意思是標准稱為“原子”的東西顯然根本不是無鎖的,甚至允許使用互斥鎖或阻止呼叫。
C ++標准不保證std::atomic<T>
操作是無鎖的。 但是,您可以使用std::atomic<T>::is_lock_free()
來查明std::atomic<T>
是否是無鎖的29.6.5 [atomics.types.operations.req]第7段:
返回:如果對象的操作是無鎖的,則返回true,否則返回false。
如果它不是無鎖的,它仍然會執行所需的同步,但它會使用一些鎖來執行此操作。
如果原子是你的意思,使用沒有鎖的硬件支持,那么是的,標准並沒有給你一個保證。 為什么? 好吧,因為不同的架構支持不同類型的硬件原子性。 std::atomic<>
具有方便的is_lock_free()
方法,該方法可用於檢查給定對象實際上是否無鎖,或者在內部使用鎖來保證原子操作。 您可以使用它並檢查您的目標硬件是否無鎖,然后決定要采用的數據結構。
然而,話雖如此,如果目標架構對您感興趣的固定寬度積分的原子操作有硬件支持,並且您沒有從貧民窟的陰暗軟件商店獲得標准庫的副本,那么它可能是打算使用硬件而不是完全鎖定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.