python3 死鎖 and 遞迴鎖

2021-08-27 11:33:19 字數 1894 閱讀 2154

目錄

死鎖:兩個或兩個以上的程序或執行緒,在執行過程中,因搶奪資源而造成的相互無解等待的現象。

遞迴鎖:在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 等鎖身上的計數為...