併發程式設計(十二) 死鎖和遞迴鎖

2021-09-29 18:59:22 字數 1978 閱讀 2600

死鎖是一種現象:

兩個及以上的程序或者執行緒在爭搶資源的過程中,出現的互相等待的現象

如果沒有外部干預,他們就一直僵持,永遠在互相等待,就「死」住了

看一下現象:

from threading import thread, lock

def func(a, b):

a.acquire()

print('a:這是func函式的開始.. ..')

b.acquire()

print('b:這是func函式的開始.. ..')

b.release()

print('b:這是func函式的結束!')

a.release()

print('a:這是func函式的結束!')

def inner(a, b):

b.acquire()

print('a:這是inner函式的開始.. ..')

a.acquire()

print('b:這是inner函式的開始.. ..')

a.release()

print('b:這是inner函式的結束!')

b.release()

print('a:這是inner函式的結束!')

def main(a, b):

func(a, b)

inner(a, b)

if __name__ == '__main__':

a = lock()

b = lock()

for i in range(10):

t = thread(target=main, args=(a, b))

t.start()

執行的時候就會出現阻塞情況(自己執行)

那我也想保護func裡面的資料,也想保護inner裡面的資料,應該怎麼辦?

為了解決上述問題,遞迴鎖應運而生

為了支援在同一執行緒中多次請求同一資源,python就提供了重入鎖rlock

這個鎖就很有意思,他裡面除了互斥鎖lock以外,還有乙個計數器counter

counter記錄了acquire的次數,從而使得資源可以被多次require

直到乙個執行緒所有的acquire都被release,其他的執行緒才能獲得資源

上面的例子如果使用rlock代替lock,則不會發生死鎖

二者的區別是:遞迴鎖可以連續acquire多次,而互斥鎖只能acquire一次

from threading import thread, rlock

def func(a, b):

a.acquire()

print('a:這是func函式的開始.. ..')

b.acquire()

print('b:這是func函式的開始.. ..')

b.release()

print('b:這是func函式的結束!')

a.release()

print('a:這是func函式的結束!')

def inner(a, b):

b.acquire()

print('b:這是inner函式的開始.. ..')

a.acquire()

print('a:這是inner函式的開始.. ..')

a.release()

print('a:這是inner函式的結束!')

b.release()

print('b:這是inner函式的結束!')

def main(a, b):

func(a, b)

inner(a, b)

if __name__ == '__main__':

b = a = rlock() # 區別在這!

for i in range(10):

t = thread(target=main, args=(a, b))

t.start()

*****

*****

併發程式設計(十二) 死鎖和遞迴鎖

死鎖是一種現象 兩個及以上的程序或者執行緒在爭搶資源的過程中,出現的互相等待的現象 如果沒有外部干預,他們就一直僵持,永遠在互相等待,就 死 住了 看一下現象 from threading import thread,lock def func a,b a.acquire print a 這是fun...

7 3 7 併發多執行緒 死鎖和遞迴鎖

所謂死鎖 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序,如下就是死鎖 from threading import thread,lock impor...

死鎖和遞迴鎖

from threading import thread,lock,rlock import time rlock鎖 也被稱之為遞迴鎖 第乙個搶到rlock鎖的人,可以連續使用acquire,release 每acquire一次,鎖身上計數加1 每release一次,鎖身上計數減1 等鎖身上的計數為...