如果檢查了記憶體_order_relaxed,為什麼要使用 memory_order_seq_cst 來設定停止標誌?
在他的“原子武器”演示中,Herb Sutter 展示了原子變量的使用,包括涉及以下場景:
工作人員檢查停止標誌:
while (!stop.load(std::memory_order_relaxed)) { // Perform tasks }
Sutter 斷言使用 memory_order_relaxed 檢查標誌是可以接受的,因為對線程停止延遲的影響最小。然而,使用 memory_order_seq_cst 來設定停止標誌的原因仍不清楚。
分析:
mo_relaxed 足以載入和儲存停止標誌:
利用更強的記憶體順序並沒有顯著的延遲優勢,即使觀察stop 或keep_running 標誌變化的延遲至關重要。
尚不清楚為什麼 Sutter 建議不要寬鬆儲存運作。然而,ISO C 標準並沒有指定商店可見性時間或影響它的因素。僅強制實施以確保有限時間內的可見性。
執行緒間延遲與實作:
執行緒間延遲主要由實作決定。現實世界的 C 實作利用硬體快取一致性機制,通常會導致儲存可見性的低延遲(數十奈秒)。
seq_cst 和寬鬆的記憶體順序都不會加速儲存可見性;它們僅控制與儲存或載入相關的後續操作的行為。更強的順序不會加速事件,而是延遲其他操作,直到維持指定的順序。
寬鬆的可見性和硬體快取一致性:
在具有快取一致性、記憶體的真實硬體上訂單不能提高商店知名度的時機;它們僅管理後續操作在儲存提交之前變得全局可見的能力。
停止標誌的寬鬆記憶體順序的好處:
寬鬆記憶體順序的主要好處用於檢查停止標誌的是:
結論:
在這種情況下,memory_order_relaxed 適合載入和儲存停止標誌。對於增強儲存可見性時序來說,memory_order_seq_cst 不是必要的。相反,它用於強制執行後續操作所需的順序,並避免同時寫入程式出現問題。
以上是為什麼要使用「memory_order_seq_cst」來設定透過「memory_order_relaxed」檢查的停止標誌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!