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

2022-02-15 04:03:09 字數 1765 閱讀 6837

1.死鎖****

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

​ 產生死鎖的情況:1.對一把互斥鎖加鎖多次

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

from threading import thread,lock

import time

mutexa=lock()

mutexb=lock()

class mythread(thread):

def run(self):

self.func1()

self.func2()

def func1(self):

mutexa.acquire()

print('\033[41m%s 拿到a鎖\033[0m' %self.name)

mutexb.acquire()

print('\033[42m%s 拿到b鎖\033[0m' %self.name)

mutexb.release()

mutexa.release()

def func2(self):

mutexb.acquire()

print('\033[43m%s 拿到b鎖\033[0m' %self.name)

time.sleep(2)

mutexa.acquire()

print('\033[44m%s 拿到a鎖\033[0m' %self.name)

mutexa.release()

mutexb.release()

if __name__ == '__main__':

#同時開啟10個執行緒

for i in range(10):

t=mythread()

t.start()

#thread-1 拿到a鎖

#thread-1 拿到b鎖

#thread-1 拿到b鎖(執行緒1執行完b上鎖以後,睡眠2s後,但此時執行緒2率先搶到a鎖,所以等程序2的a鎖解開後,才能執行程序1中的fun2的a鎖執行,但此時程序2中需要b鎖,但程序1中的b鎖並未解開,所以產生死鎖)

#thread-2 拿到a鎖

2.遞迴鎖

​ 特點:1.多執行緒之間都有互斥的效果,不同在於,同乙個執行緒可以對同乙個鎖進行多次acquire

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

3.訊號量

​ 可以限制同時併發執行公共**的執行緒數量,如果限制數量為1,則與普通互斥鎖沒有區別

from threading import semaphore,current_thread,thread

import time

s = semaphore(2)#同一時間最大併發2個

def task():

s.acquire()

time.sleep(1)

print(current_thread().name)

s.release()

for i in range(10):

thread(target=task).start()

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

死鎖,遞迴鎖,訊號量

對同一把鎖多次acquire將導致死鎖,可以給acquire加上超時 timeout 來保證執行緒不被卡死。from threading import lock l lock l.acquire l.acquire timeout 3 乙個共享資源,要訪問必須同時具備多把鎖,但是這些鎖被不同的程序或...

互斥鎖 死鎖 遞迴鎖 訊號量 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...