簡體   English   中英

當 is_lock_free() == false 時,是否存在無法保證 std::atomic 的原子性的情況?

[英]Is there any case that the atomicity of std::atomic is not guaranteed, when is_lock_free() == false?

即使is_lock_free() == false ,通常也可以保證 std::atomic 的原子性。 是對的嗎?

我徘徊在is_lock_free() == false時,存在無法保證原子性的計算機環境或情況。

非無鎖原子不是無地址的,因此在兩個進程之間共享 memory 意味着它們不尊重彼此的鎖。 (對於在同一進程中持有相同原子 object 的頁面的兩個虛擬映射相同, 除非 hash 鎖表僅在地址的低位索引,頁內偏移,但這可能是一個壞設計。)

ISO C++ 沒有定義內存映射函數或進程,因此標准本身並沒有 go 詳細說明,只是說無鎖原子應該是無地址的(這使得它們在共享內存中工作)。 現實世界的實施就是這種情況。

否則它總是原子的。 通常的實現機制很簡單:使用地址來索引自旋鎖或互斥表。

當然,這假設程序沒有未定義的行為,但 C++ 中的所有其他內容也是如此。在 C++ 程序執行期間任何地方的任何 UB 意味着在該點之前或之后的所有保證都在 window 之外。

在實踐中,除了使用memcpy或普通uint64_t*訪問std::atomic表示而不是通過std::atomic<uint64_t> class。

無鎖 std::atomic 實際上更容易用 UB 破壞,例如通過取消引用未與alignof(std::atomic<T>)對齊的atomic<T>* 在許多支持未對齊加載/存儲的 ISA 上,它會運行但實際上不是原子的,因為 C++ 實現依賴於硬件保證對齊加載和存儲的原子性。

暫無
暫無

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

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