簡體   English   中英

為什么只有 std::atomic_flag 保證是無鎖的?

[英]Why only std::atomic_flag is guaranteed to be lock-free?

來自 C++ Concurrency in Action:

std::atomic 和 std::atomic_flag 的區別在於 std::atomic 可能不是無鎖的; 實現可能必須在內部獲取互斥鎖以確保操作的原子性

我想知道為什么。 如果 atomic_flag 保證是無鎖的,為什么不保證atomic<bool>也是如此? 這是因為成員函數compare_exchange_weak嗎? 我知道有些機器缺少一條比較和交換指令,是這個原因嗎?

首先,您完全可以使用std::atomic<very_nontrivial_large_structure> ,因此通常不能保證std::atomic是無鎖的(盡管大多數像boolint這樣的瑣碎類型的特化可能可以,在大多數系統上)。 但這有點無關。

在 N2427/29.3 的注釋中給出了atomic_flag和其他任何東西都必須是無鎖的確切原因:

因此操作必須是無地址的。 沒有其他類型需要無鎖操作,因此 atomic_flag 類型是符合此標准所需的最小硬件實現類型 其余類型可以使用 atomic_flag 進行模擬,盡管屬性不太理想。

換句話說,它是每個平台上必須保證的最低限度,因此可以正確實施標准。

該標准不保證原子對象是無鎖的。 在不為類型T提供無鎖原子操作的平台上, std::atomic<T>對象可以使用互斥鎖來實現,這不會是無鎖的。 在這種情況下,任何在其實現中使用這些對象的容器也不會是無鎖的。

該標准提供了檢查std::atomic<T>變量是否無鎖的機會:您可以使用var.is_lock_free()atomic_is_lock_free(&var) 對於 int 等基本類型,還提供了宏(例如ATOMIC_INT_LOCK_FREE ),用於指定對該類型的無鎖原子訪問是否可用。

std::atomic_flag是一個原子布爾類型。 對於boolean類型,幾乎總是不需要使用互斥鎖或其他同步方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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