python 互斥鎖 死鎖

2021-10-06 02:10:53 字數 1603 閱讀 4521

在多執行緒下,全域性變數是共享的,但是在兩個執行緒同時使用乙個全域性變數時,會出現這麼乙個情況,當a讀取了全域性變數a,b也讀取全域性變數a,a對a進行了+1操作,但是b是讀取a沒有進行一次+1操作之前的資料,然後b也進行+1操作,這就導致這錯誤的出現。

為了防止這個錯誤的出現,所以引進互斥鎖。

使用鎖就需要使用threading裡面的lock()

#建立鎖。預設下未鎖

mutex = threading.lock(

)

#鎖定

mutex.acquire(

)

#釋放即解鎖

mutex.release(

)

以上就是互斥鎖的三個過程

當乙個資源被上鎖時另乙個執行緒將無法對上鎖的進行操作等,這樣就可以防止上面錯誤的出現了

但是互斥鎖也會出現錯誤,即死鎖,當執行緒a首先給資源a上鎖,執行緒b給資源b上鎖,同時執行緒a在1秒後請求對資源b上鎖,執行緒b請求對資源a上鎖,此時,a在等b釋放資源,b在等a釋放資源。這就導致了死鎖的產生。

import threading

import time

class

firstmutex

(threading.thread)

:def

run(self)

:# 對資源a上鎖

locka.acquire(

)print

("a被a上鎖"

) time.sleep(1)

# 對b上鎖

lockb.acquire(

)print

("b被a上鎖"

)# 釋放資源

locka.release(

)class

secondmutex

(threading.thread)

:def

run(self)

:# 對資源a上鎖

lockb.acquire(

)print

("b被b上鎖"

) time.sleep(1)

locka.acquire(

)print

("a被b上鎖"

) lockb.release(

)#建立兩個鎖

可以看出,此時一直被堵塞在這裡,a即沒對b上鎖成功,b也沒對a上鎖成功。

解決死鎖的辦法:

1、銀行家演算法,即在程式設計時去避免死鎖的產生

2、設定超時,即設定乙個等待時間,超過等待時間就主動釋放資源

python 互斥鎖,死鎖

同步與非同步之間的區別 1.同步 可以理解為執行緒a和b一塊配合工作,a執行到一定程度時要依靠b的某個結 果,於是停下來示意b執行,b執行完將結果給a,然後a繼續執行。2.非同步 非同步是指程序不需要一直等待下去,而是繼續執行下面的操作,不管其他程序的狀態,當有資訊返回的時候會通知程序進行處理,這樣...

Python互斥鎖 死鎖

死鎖當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制。執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀...

python 互斥鎖與死鎖

一.概念原理 當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定。某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,...