動機:
我只是在學習多執行緒的基礎知識,還沒有接近完成它們,但我想在我的學習之旅的早期提出一個問題,以指導我研究與我正在從事的專案最相關的主題。
主要的:
一種。如果一個行程有兩個執行緒,一個編輯一組變數,另一個只讀取這些變數,從不編輯它們的值;那么我們是否需要任何型別的同步來保證讀取執行緒讀取值的有效性?
灣 作業系統調度這兩個執行緒是否有可能導致讀取執行緒在寫入執行緒寫入同一內??存位置的同一時刻讀取記憶體位置中的變數,或者這只是硬體/總線情況永遠不會被允許發生,軟體設計師不應該關心這個嗎?如果變數是一個大的結構體而不是一個小的 int 或 char 怎么辦?
uj5u.com熱心網友回復:
一種。如果一個行程有兩個執行緒,一個編輯一組變數,另一個只讀取這些變數,從不編輯它們的值;那么我們是否需要任何型別的同步來保證讀取執行緒讀取值的有效性?
一般來說,是的。否則,編輯該值的執行緒只能在本地更改該值,以便其他執行緒永遠不會看到該值的更改。這可能是因為編譯器(可以使用暫存器來讀取/存盤變數)以及硬體(關于目標平臺上使用的快取一致性機制)。通常,鎖、原子變數和記憶體屏障用于執行此類同步。
灣 作業系統調度這兩個執行緒是否有可能導致讀取執行緒在寫入執行緒寫入同一內??存位置的同一時刻讀取記憶體位置中的變數,或者這只是硬體/總線情況永遠不會被允許發生,軟體設計師不應該關心這個嗎?如果變數是一個大的結構體而不是一個小的 int 或 char 怎么辦?
通常,不能保證訪問是原子完成的。理論上,兩個內核分別執行一個執行緒可以同時加載/存盤相同的變數(但在實踐中通常不會)。它非常依賴于目標平臺。
對于具有(連貫)快取的處理器(即所有現代主流處理器)快取線(即通常為 64 或 128 位元組的塊)對執行緒之間的隱式同步有巨大影響。這是一個復雜的主題,但您可以先閱讀有關快取一致性的更多資訊,以了解記憶體層次結構在現代平臺上的作業原理。快取一致性協議可防止在同一快取行中完全同時進行兩次加載/存盤。如果變數跨越多個快取行,則沒有保護。
在廣泛使用的 x86/x86-64 平臺上,假設地址正確對齊(它不跨快取行),可以原子地修改原始型別 <= 8 位元組的變數(因為總線支持該地址以及 DRAM 和快取) )。然而,這并不意味著所有此類訪問都是原子的。您需要將其指定給編譯器/解釋器/等。所以它產生/執行正確的指令。請注意,還有一個 16 位元組原子的擴展。還有一個指令集擴展用于支持事務記憶體。對于更廣泛的型別(或可能是復合型別),您可能需要鎖或原子狀態來控制訪問目標變數的原子性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361837.html
