在他的「原子武器」演講中,Herb Sutter 示範了一個範例,其中主執行緒使用 memory_order_seq_cst 設定停止標誌,多個工作執行緒使用 memory_order_relaxed 檢查該標誌。 Sutter 解釋說,由於延遲影響可以忽略不計,因此使用 memory_order_relaxed 進行檢查是可以接受的。不過,他建議使用 memory_order_seq_cst 來進行設定標誌的操作,但沒有提供具體原因。
理解記憶體排序的概念在這裡至關重要。記憶體順序定義了原子操作提供的可見性和同步保證。在此範例中,使用 memory_order_seq_cst 設定標誌可確保以下內容:
考慮到載入操作使用了 memory_order_relaxed,使用 memory_order_seq_cst 進行寫入操作可能看起來有點過多,但實際上它有沒有顯著的效能影響。無論使用什麼記憶體順序,都需要實作使原子儲存在合理的時間內可見。
雖然使用memory_order_seq_cst 進行寫入操作的延遲影響很小,它提供了幾個好處:
總之,使用 memory_order_seq_cst 來設定停止本例中的flag並不是為了效能最佳化,而是為了確保正確性和執行緒安全性。雖然 memory_order_relaxed 對於載入操作是可以接受的,但使用 memory_order_seq_cst 進行寫入操作可以在不影響效能的情況下提供額外的保證。
以上是如果使用「memory_order_relaxed」進行檢查,為什麼要使用「memory_order_seq_cst」來設定停止標誌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!