![](/img/trans.png)
[英]Why is std::atomic<T>::is_lock_free() not static as well as constexpr?
[英]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.