[英]c++ Multithreading - how writes to a shared variable are handled
正如標題所示 - 在 C++ 中,如何處理線程中對共享變量的寫入? 線程是否使用它們自己的數據副本? 我知道線程之間共享什么,什么不是,但我找不到關於在多線程場景中如何處理對變量的寫入的任何信息。
讓我給你一點背景。 在 Java 中,線程處理自己的數據副本。 我們添加同步以確保線程的寫入對其他線程可見。 簡而言之,同步可確保將寫入刷新到主 memory。
類似的構造對 c/c++ 有效嗎? 如果一個線程正在寫入一個變量,這些寫入是立即更新到主 memory 還是由操作系統控制如何寫入主 memory? 我們是否需要添加同步來刷新這些更新?
例如,如果兩個線程正在遞增一個計數器,並且我可以保證第一個線程將始終首先完成該特定任務(不知何故,通過使用第二個線程的延遲啟動,在實踐中可能無法保證)並且不會不是兩個線程之間的任何指令混亂,那么我是否總是能看到兩個線程的影響?
Thread 1 { i++; ... do something that takes long time}
Thread 2 { i++; ... do something that takes long time}
謝謝, RG
線程是否使用它們自己的數據副本?
不,除非數據被聲明為thread_local
。
同步確保寫入刷新到主 memory。 類似的構造對 c/c++ 有效嗎? 如果線程正在寫入變量,這些寫入是否會立即更新到主 memory
是的,但除非您使用某種同步,否則其他線程可能會或可能不會看到更改 - 或讀取不正確。
我們是否需要添加同步來刷新這些更新?
是的,但我不確定我是否會使用沖洗這個詞。 “同步”很好。
例如,如果兩個線程正在遞增一個計數器,我可以保證第一個線程總是首先完成......
如果你能保證,你就有同步。
我會一直看到這兩個線程的影響嗎?
是的,如果你有你所說的保證。
C++ 不能保證讀/寫和刷新到 memory 的原子性如何工作,除非您使用諸如std::atomic
之類的原子原語。 在這里要非常小心。 無鎖編程很難做到正確。
我的建議是使用鎖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.