我知道 std::atomics 應該有明確定義的行為,但我找不到一個易于理解的在線答案來回答這個問題:Std::atomic.load() 和 .store() 有執行保證嗎?
如果兩個執行緒嘗試對同一個 std::atomic 物件進行并發寫入或讀取,寫入和讀取是否都保證執行?換句話說,寫入或讀取任務是否可能根本無法完成?一個或兩個會被阻止嗎?還是保證它們是順序化的?我不是在這里詢問操作順序。我只是在問手術是否會在未來某個未指定的時間完成。
uj5u.com熱心網友回復:
編譯器和處理器確保執行已編程的操作是一個基本假設。這與std::atomic<>. 提供的保證std::atomic<>是單個操作以原子方式發生。
那是什么意思?
考慮兩個執行緒 A 和 B,它們都遞增相同的整數變數。此操作通常涉及讀取整數、加 1 和寫入結果(請注意,這只是一個示例,C 標準沒有說明如何將操作分解為原子步驟,因此我們無法根據標準)。
在這種情況下,我們將有步驟“讀取”、“加一”和“寫入”。對于每個執行緒,這些步驟保證按該順序執行,但不能保證這些步驟是如何交錯的。它可能是:
B: read
B: add1
B: write
A: read
A: add1
A: write
這導致整數增加兩次。
它也可能是
A: read
A: add1
B: read
B: add1
B: write
A: write
這將導致整數只增加一次。
因此這個實作會有一個競爭條件。
為了擺脫它,我們可以使用 astd::atomic<int>而不是一個普通int的整數。std::atomic<int>實作了 運算子,并且std::atomic<>提供的保證是在這種情況下遞增將自動發生。
在示例中,這意味著步驟序列 - 讀取、添加、寫入 - 不會被另一個執行緒中斷。仍然無法保證執行緒之間的執行順序。因此,我們可以有
A: read
A: add1
A: write
B: read
B: add1
B: write
要么
B: read
B: add1
B: write
A: read
A: add1
A: write
但其他組合是不可能的,在這兩種情況下,整數都將增加兩次。因此沒有競爭條件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/451297.html
上一篇:多實體任務執行
