示例: 線程完成寫入共享變量的操作,然後解鎖它,但繼續使用該變量的值(而不更改它)。 然後,另一個線程立即成功解鎖()該互斥並讀取共享變量。PTHREAD互斥體只能避免同時訪問資源,或者它還有其他更多的功能嗎?
對於我的(誤)的理解,有些事情可能會發生在這種情況:
在寫線程:
編譯器優化可以使寫僅發生在稍後的某個點
寫入的值可以保留在當前CPU核心的緩存,並刷新到內存在以後的某個點
在讀線程:
可以互斥鎖()之前已經被讀取變量的值,因爲一些編譯器優化或只是CPU緩存平時的工作中,依然是認爲「已經從內存中讀取」,因此不會再從內存中取回。
因此,我們這裏的值不是來自其他線程的更新值。
是否並行線程互斥鎖定/解鎖()函數執行任何代碼,以「刷新」當前緩存到內存和其他任何以確保當前線程需要的是一切同步(我想不出除了緩存以外的其他東西),還是僅僅不需要(至少在所有已知的架構中)?因爲如果所有的互斥量都是這個名稱的作用 - 互斥對它的引用 - 那麼,如果我有成千上萬的線程處理相同的數據,並且從我的算法的角度來看,我已經知道當一個互斥量線程正在使用變量,沒有其他線程會嘗試同時使用它,這意味着我不需要互斥鎖?或者我的代碼是否會缺少PTHREAD庫中實現的一些低級別和特定於架構的方法以避免上述問題?