死鎖,遞迴鎖,訊號量

2022-05-19 12:45:07 字數 931 閱讀 7812

對同一把鎖多次acquire將導致死鎖,可以給acquire加上超時(timeout)來保證執行緒不被卡死。

from threading import lock

l=lock()

l.acquire()

l.acquire(timeout=3)

乙個共享資源,要訪問必須同時具備多把鎖,但是這些鎖被不同的程序或者執行緒所持有,就會導致相互等待對方釋放,從而程式就卡死了。

比如吃飯要碗和筷子兩把鎖,a搶了筷子,b搶了碗。

解決方案:

搶鎖一定要按照相同的順序去搶

給搶鎖加上超時,如果超時則放棄執行

與普通鎖的區別

​ 多執行緒之間都有互斥的效果

​ 不同在於 同乙個執行緒可以對這個鎖 執行多次acquire

​ 同乙個執行緒必須保證 加鎖的次數和解鎖的次數相同 其它執行緒才能夠搶到這把鎖

可以限制同時併發執行公共**的執行緒數量

如果限制數量為1 則與普通互斥鎖沒有區別

from threading import semaphore,currentthread,thread

import time

s = semaphore(5)

def task():

s.acquire()

time.sleep(1)

print(currentthread().name)

s.release()

for i in range(10):

thread(target=task).start()

注意:訊號量不是用來解決安全問題的 而是用於限制最大的併發量

互斥鎖 死鎖 遞迴鎖 訊號量 GIL鎖

互斥鎖lock也是一種阻塞,可以保證共享資料操作的完整性。保證在任一時刻,只能有乙個執行緒訪問該物件 from multiprocessing import process from threading import thread from multiprocessing import lock 程...

互斥鎖,遞迴鎖,訊號量

互斥鎖,遞迴鎖,訊號量 以上都是程序 執行緒 鎖,下面我就一一解釋一下 最普通互斥鎖 from threading import thread,lock import time defwork l.acquire time.sleep 1 print ok l.release if name mai...

併發程式設計中關於死鎖,遞迴鎖,訊號量的理解

1.死鎖 所謂死鎖 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序,如下就是死鎖 產生死鎖的情況 1.對一把互斥鎖加鎖多次 2.乙個共享資源 要訪問必...