如果我們有一個具有兩個資料成員 A 和 B 的物件;從并行運行的兩個不同執行緒訪問兩個成員時,我們是否需要任何形式的同步?如果物件是一個全域變數,而物件是一個堆物件,通過指向其地址的指標訪問呢?
編輯:每個執行緒只讀寫一個不同的成員,一一關聯,執行緒數等于資料成員數,執行緒對它們進行不同的訪問,直到它們完成并加入主執行緒。
uj5u.com熱心網友回復:
您正在尋找的關鍵字是memory model。
非位域成員是不同的記憶體位置;讀/寫不同成員沒有競爭條件。
在一個執行緒中寫入并在另一個相同記憶體位置訪問是潛在的沖突。除非某些要求得到支持(就像之前發生的那樣),否則這是一種競爭條件,并且您的程式具有 UB(未定義行為)。
但是訪問(讀或寫)不是位域的不同成員不會觸發這個。
實際規則更為復雜;例如,并非所有位域都共享一個記憶體位置。
uj5u.com熱心網友回復:
對于只有一個執行緒訪問的資料成員,不需要同步。對于可能由執行緒寫入并且也可能由任何其他執行緒(以任何方式)訪問的資料成員,同步是必要的。
物件是全域的還是在堆上沒有區別,除了堆上的物件可能會被洗掉,而其他執行緒仍然持有指向它們的指標——例如,如果執行緒 1 洗掉物件而執行緒 2(可能) ) 訪問該物件中的一個或多個資料成員,就會遇到問題,因為執行緒 2 可能會嘗試讀取或寫入資料成員曾經所在的現在空閑記憶體位置,從而呼叫未定義的行為。(您通常會通過在創建將使用它的執行緒之前分配堆物件來避免該問題,并且在該執行緒退出并且您已經呼叫join()它以確保它消失之后才洗掉該堆物件)
uj5u.com熱心網友回復:
1.如果你只從不同的執行緒讀A和B,沒有同步
2.如果一些執行緒讀AB,一些執行緒寫他們,應該有同步,這里你可以使用兩個讀/寫鎖,以避免相互影響訪問 A 或 B。你可以使用std::shared_mutex
來實作讀/寫鎖
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371834.html
下一篇:Python:執行緒未并行運行
