簡體   English   中英

c ++原子讀/寫誤解

[英]c++ atomic read/write misunderstanding

為什么使用此代碼編程有時會打印“2”?

int main() {
    std::atomic<int> a;
    a = 0;

    std::thread t1([&]{++a;});
    std::thread t2([&]{a++;});
    std::thread t3([&]{
        a = a.load() + 1;
    });

    t1.join();
    t2.join();
    t3.join();

    if (a != 3) {
        std::cout << "a: " << a << std::endl;
    }
}

我認為std::atomic保證所有操作都將以原子方式完成,因此在這里寫(遞增)將使用內存屏障,我們將在線程結束時始終使用3 我已經探索了代碼並發現問題線程是t3但我無法理解為什么它是錯誤的。

與其他兩個線程不同, t3不執行原子添加。 相反,它以原子方式加載a對臨時執行算術(加1),並以原子方式將新值存儲回a 這將覆蓋a不管有可能發生之間在原子操作的。

所以你可以有以下場景:

  1. t1t2原子遞增a ,現在等於1。
  2. t3原子加載1。
  3. t1t2原子遞增a ,現在等於2。
  4. t3對先前加載的值執行非原子添加並以原子方式存儲回2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM