目錄
死鎖:兩個或兩個以上的程序或執行緒,在執行過程中,因搶奪資源而造成的相互無解等待的現象。
遞迴鎖:在python中支援在同一執行緒中多次請求同一資源。
- rlock模組:遞迴鎖的實現模組,用來防止死鎖問題出現
死鎖程序:產生了死鎖現象的程序。
例如:
from threading import thread,lock,rlock
import time
mutexa=lock()
mutexb=lock()
class mythead(thread):
def run(self):
self.f1()
self.f2()
def f1(self):
mutexa.acquire()
print('%s 搶到a鎖' %self.name)
mutexb.acquire()
print('%s 搶到b鎖' %self.name)
mutexb.release()
mutexa.release()
def f2(self):
mutexb.acquire()
print('%s 搶到了b鎖' %self.name)
time.sleep(2)
mutexa.acquire()
print('%s 搶到了a鎖' %self.name)
mutexa.release()
mutexb.release()
if __name__ == '__main__':
for i in range(100):
t=mythead()
t.start()
打個比方:a.b兩個房間,a,b兩個人。a被鎖在b房間拿著a房鑰匙,a被鎖在b房間拿著b房鑰匙。
原理:內部存在乙個lock本地鎖,乙個counter變數記錄acquire的次數。每一次資源的acquire引用會增加counter數值,每一次資源的release釋放會減少counter數值。直到乙個執行緒內的counter的值變為0,即所有acquire都被release了,其他執行緒才能獲得資源。
from threading import thread,lock,rlock
import time
# mutexa=lock()
# mutexb=lock()
mutexb=mutexa=rlock()
class mythead(thread):
def run(self):
self.f1()
self.f2()
def f1(self):
mutexa.acquire()
print('%s 搶到a鎖' %self.name)
mutexb.acquire()
print('%s 搶到b鎖' %self.name)
mutexb.release()
mutexa.release()
def f2(self):
mutexb.acquire()
print('%s 搶到了b鎖' %self.name)
time.sleep(2)
mutexa.acquire()
print('%s 搶到了a鎖' %self.name)
mutexa.release()
mutexb.release()
if __name__ == '__main__':
for i in range(100):
t=mythead()
t.start()
python3 執行緒死鎖
所謂死鎖 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序,如下就是死鎖 code from threading import thread,lock ...
Python 互斥鎖 遞迴鎖 死鎖機制詳解
互斥鎖 犧牲了執行效率而獲得資料安全 問題 多個執行緒搶占資源,會發生資料混亂 from threading import thread import os,time def work global n temp n time.sleep 0.1 n temp 1 if name main n 10...
死鎖和遞迴鎖
from threading import thread,lock,rlock import time rlock鎖 也被稱之為遞迴鎖 第乙個搶到rlock鎖的人,可以連續使用acquire,release 每acquire一次,鎖身上計數加1 每release一次,鎖身上計數減1 等鎖身上的計數為...