死鎖是一種現象:
兩個及以上的程序或者執行緒在爭搶資源的過程中,出現的互相等待的現象
如果沒有外部干預,他們就一直僵持,永遠在互相等待,就「死」住了
看一下現象:
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 等鎖身上的計數為...