首頁 >後端開發 >C++ >如果使用 memory_order_relaxed 檢查它,為什麼要使用 memory_order_seq_cst 設定停止標誌?

如果使用 memory_order_relaxed 檢查它,為什麼要使用 memory_order_seq_cst 設定停止標誌?

DDD
DDD原創
2024-11-11 15:22:03633瀏覽

Why set the stop flag using memory_order_seq_cst, if you check it with memory_order_relaxed?

如果使用 memory_order_relaxed 檢查它,為什麼要使用 memory_order_seq_cst 設定停止標誌?

在影片中,Herb Sutter 討論了使用原子,包括主執行緒啟動工作執行緒的範例。工作人員檢查停止標誌,主執行緒最終使用 memory_order_seq_cst 將停止標誌設為 true。 Sutter 解釋說,使用 memory_order_relaxed 檢查標誌是可以接受的,因為停止線程的延遲並不顯著。

問題在於為什麼使用 memory_order_seq_cst 而不是 memory_order_relaxed 設定停止標誌。

mo_relaxed 對於停止標誌的載入和儲存都很好

在這種情況下,更強的記憶體順序沒有任何有意義的延遲優勢,即使看到更改的延遲stop 或keep_running 標誌很重要。

ISO C 標準沒有指定商店可見的速度或可能影響它的因素。它只要求實現確保原子或同步操作分配的最後一個值在有限的時間內對所有其他執行緒可見。

線程間延遲主要是實現品質問題,標準讓事情變得開放。普通 C 實作通常針對某些架構編譯為 asm,並公開硬體的快取一致性屬性,從而降低執行緒間延遲。

在使用快取一致性的實際硬體上,儲存或載入的不同記憶體順序不會改變。讓商店更快即時可見。它們控制在等待儲存空間從儲存緩衝區提交到 L1d 快取時後續操作是否可以全域可見。

更強的命令和障礙,絕對不會讓事情發生得更快。它們會延遲其他事情,直到允許與儲存或載入相關的事情發生。

使用memory_order_relaxed 進行載入的效能優勢

使用memory_order_relaxed 進行載入具有以下效能優勢:

  • 避免不必要的載入等待完成,當不必要的載入產生錯誤時,允許跨循環迭代實現更多指令級和記憶體級並行性。
  • 避免 ISA 上的額外指令,其中取得或 SC 載入需要額外的指令,例如某些架構上的 2 路屏障指令。

在這種特定場景中,停止標誌很少設置,浪費了由於錯誤負載而產生的工作是最小的。因此,使用 memory_order_relaxed 的效能優勢超過了潛在的缺點。

以上是如果使用 memory_order_relaxed 檢查它,為什麼要使用 memory_order_seq_cst 設定停止標誌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn