在多執行緒下,全域性變數是共享的,但是在兩個執行緒同時使用乙個全域性變數時,會出現這麼乙個情況,當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 互斥鎖與死鎖
一.概念原理 當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定。某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,...