互斥鎖有一些缺點:例如,如果忘記對互斥鎖解除鎖定,會怎麼樣呢?如果是這樣,則試圖鎖定已經被鎖定的互斥鎖的任何程序只能永無止境地等到。這些執行緒就成為僵死(zombie thread),這是乙個技術術語,指雖然存在但不能幹任何事情的執行緒。顯而易見,我們並不希望這種事情發生。
互斥鎖還有另外乙個問題,看看在下面的情況下會怎麼樣?
如果兩線程依賴於同乙個物件(比方說遊戲玩家的狀態這一物件,每幀都要訪問此狀態,在乙個普通的遊戲中訪問頻率大約是每秒30~60次)。與此同時,另乙個執行緒需要對此狀態做許多處理(如果程式中此函式的效率不高,處理過程最多需要花30秒時間,假定它隨時可以鎖定互斥鎖,即使他不使用鎖定的物件也如此)。第乙個執行緒需要很多更新資訊,但實質上它中止了很長時間,因為它要等到第二個執行緒完成,這樣遊戲看起來就會滯後。
互斥鎖機制,互斥鎖與讀寫鎖區別
互斥鎖 mutex,用於保證在任何時刻,都只能有乙個執行緒訪問該物件。當獲取鎖操作失敗時,執行緒會進入睡眠,等待鎖釋放時被喚醒 讀寫鎖 rwlock,分為讀鎖和寫鎖。處於讀操作時,可以允許多個執行緒同時獲得讀操作。但是同一時刻只能有乙個執行緒可以獲得寫鎖。其它獲取寫鎖失敗的執行緒都會進入睡眠狀態,直...
鎖 互斥鎖,死鎖
當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀態變...
Go 互斥鎖和讀寫互斥鎖的實現
目錄 先來看這樣一段 所存在的問題 var wg sync.waitgroup var x int64 func main func f wg.done 這裡為什麼輸出是 12135 不同的機器結果不一樣 而不是20000。因為 x 的賦值,總共分為三個步驟 取出x的值 計算x的結果 給x賦值。那麼...