簡體   English   中英

c++ 多線程 - 如何處理對共享變量的寫入

[英]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.

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