互斥鎖,解決原子性問題以及加鎖後引發的死鎖

2021-10-05 16:00:46 字數 846 閱讀 1052

互斥鎖,解決原子性問題以及加鎖後引發的死鎖

原子性的問題就是執行緒切換。在單核時代,同一時刻只有乙個執行緒工作,禁用cpu中斷就能禁止執行緒切換。多核時代,同一時刻可能有多個執行緒在執行,禁用cpu中斷並不能解決原子性問題。經過上述分析得出結論,同一時刻只有乙個執行緒執行是解決原子性問題的必要條件,這個條件稱之為互斥,保證共享變數的修改是互斥的,無論是單核還是多核,都可以保證其原子性。

這裡增加多乙個概念:細粒度鎖:用不同的鎖對受保護資源進行精細化管理,能夠提公升效能。

解決原子性問題的方法就是使中間狀態不可見

使用細粒度鎖是有代價的,這個代價就是有可能導致死鎖:一組互相競爭資源的執行緒因相互等待,導致永久阻塞的現象死鎖出現的四個必要條件:(1)互斥:共享資源x和y只能被乙個執行緒占用

(2)占有且等待:執行緒t1已經取得共享資源x,在等待共享資源y時,不釋放共享資源x

(3)不可搶占:其他執行緒不能強行搶占執行緒t1占有的資源

(4)迴圈等待:執行緒t1等待執行緒t2占有的資源,執行緒t2等待執行緒t1占有的資源,這就是迴圈等待

因此只要我們破環其中乙個條件,就可以避免死鎖

互斥是無法被破壞掉的,因為我們加鎖就是為了互斥

破壞占有且等待條件:思路就是一次申請所有共享資源 x和y,要增加乙個資源管理者,來管理x和y,控制你只能一次性拿到x和y,不然就都拿不到

破壞不可搶占條件:核心就是執行緒能主動釋放它所占有的資源

破壞迴圈等待條件:破壞這個條件,需要對資源進行排序,然後按序申請資源

互斥鎖 解決原子性問題

原子性 乙個或多個操作在cpu執行的過程中不被中斷的特性 原子性問題的源頭是執行緒切換,作業系統做執行緒切換依賴於cpu中斷,所以禁止cpu中斷就能禁止執行緒切換。示例 在32位cpu上執行long型別變數的寫操作,long型別變數是64位,所以會被拆分為兩次寫操作 寫高32位和寫低32位 1.單核...

多執行緒 互斥鎖解決買票問題

在這個 介紹了多執行緒的安全隱患 買票問題 總票數 property nonatomic,assign int tickets end void touchesbegan nsset touches withevent uievent event 加鎖,互斥鎖 加鎖,鎖定的 盡量少 加鎖範圍內的 同...

使用互斥鎖解決資源競爭問題

互斥鎖 為資源引入乙個狀態,鎖定 非鎖定 方法1 import threading import time g num 0 新增互斥鎖 mutex threading.lock def test1 num global g num 上鎖,如果之前沒有被上鎖,那麼此時上鎖成功 如果上鎖之前已經被上鎖則...