首頁 >後端開發 >C++ >為什麼要使用「memory_order_seq_cst」來設定透過「memory_order_relaxed」檢查的停止標誌?

為什麼要使用「memory_order_seq_cst」來設定透過「memory_order_relaxed」檢查的停止標誌?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-15 03:10:021019瀏覽

Why Use `memory_order_seq_cst` for Setting a Stop Flag Checked with `memory_order_relaxed`?

如果檢查了記憶體_order_relaxed,為什麼要使用 memory_order_seq_cst 來設定停止標誌?

在他的“原子武器”演示中,Herb Sutter 展示了原子變量的使用,包括涉及以下場景:

  • 主線程生成工作線程
  • 工作人員檢查停止標誌:

    while (!stop.load(std::memory_order_relaxed))
    {
      // Perform tasks
    }
  • 主執行緒最後使用memory_order_seq_cst 將stop 設為true。

Sutter 斷言使用 memory_order_relaxed 檢查標誌是可以接受的,因為對線程停止延遲的影響最小。然而,使用 memory_order_seq_cst 來設定停止標誌的原因仍不清楚。

分析:

mo_relaxed 足以載入和儲存停止標誌:

利用更強的記憶體順序並沒有顯著的延遲優勢,即使觀察stop 或keep_running 標誌變化的延遲至關重要。

尚不清楚為什麼 Sutter 建議不要寬鬆儲存運作。然而,ISO C 標準並沒有指定商店可見性時間或影響它的因素。僅強制實施以確保有限時間內的可見性。

執行緒間延遲與實作:

執行緒間延遲主要由實作決定。現實世界的 C 實作利用硬體快取一致性機制,通常會導致儲存可見性的低延遲(數十奈秒)。

seq_cst 和寬鬆的記憶體順序都不會加速儲存可見性;它們僅控制與儲存或載入相關的後續操作的行為。更強的順序不會加速事件,而是延遲其他操作,直到維持指定的順序。

寬鬆的可見性和硬體快取一致性:

在具有快取一致性、記憶體的真實硬體上訂單不能提高商店知名度的時機;它們僅管理後續操作在儲存提交之前變得全局可見的能力。

停止標誌的寬鬆記憶體順序的好處:

寬鬆記憶體順序的主要好處用於檢查停止標誌的是:

  • 當載入結果為false 時,增加循環迭代的並行性。
  • 避免不必要的指令執行,特別是在需要額外載入的 ISA 上指令(例如 ARMv7 dmb ish)。

結論:

在這種情況下,memory_order_relaxed 適合載入和儲存停止標誌。對於增強儲存可見性時序來說,memory_order_seq_cst 不是必要的。相反,它用於強制執行後續操作所需的順序,並避免同時寫入程式出現問題。

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

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