簡體   English   中英

C ++ 11標准是否保證將std :: atomic <>實現為無鎖操作?

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

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