互斥鎖,遞迴鎖,訊號量

2022-08-15 02:57:10 字數 3031 閱讀 1007

互斥鎖,遞迴鎖,訊號量

以上都是程序(執行緒)鎖,下面我就一一解釋一下

最普通互斥鎖

from threading import

thread,lock

import

time

defwork():

l.acquire()

time.sleep(1)

print('ok'

) l.release()

if__name__ == '

__main__':

l =lock()

t_l =

start =time.time()

for i in range(10):

t = thread(target=work)

t.start()

for t in

t_l:

t.join()

print(time.time()-start)

看一下最後執行時間,如果沒有互斥鎖,執行緒是並行執行,時間在1s多點,而有互斥鎖後,執行緒變成序列執行,時間是10s多點,

它有什麼作用:保證同一時間只有乙個程序(執行緒在修改資料,從而使修改的共享資料安全),也是為什麼cpython直譯器不能在同一程序內真正意義上併發執行緒(gil鎖)

遞迴鎖

from threading import

thread,rlock

import

time

mutex =rlock()

class

my_thread(thread):

def__init__

(self):

super().

__init__

() self.count =0

defrun(self):

self.f1()

self.f2()

deff1(self):

mutex.acquire()

self.count += 1time.sleep(0.5)

print('

%s is use lock %s

'%(self.getname(),self.count))

mutex.acquire()

self.count += 1time.sleep(0.5)

print('

%s is use lock %s

' %(self.getname(), self.count))

mutex.release()

self.count -= 1

print('

%s is use lock %s

' %(self.getname(), self.count))

mutex.release()

self.count -= 1

print('

%s is use lock %s

' %(self.getname(), self.count))

deff2(self):

mutex.acquire()

time.sleep(0.5)

self.count += 1

print('

%s is use lock %s

' %(self.getname(), self.count))

mutex.acquire()

self.count += 1time.sleep(0.5)

print('

%s is use lock %s

' %(self.getname(), self.count))

mutex.release()

self.count -= 1

print('

%s is use lock %s

' %(self.getname(), self.count))

mutex.release()

self.count -= 1

print('

%s is use lock %s

' %(self.getname(), self.count))

if__name__ == '

__main__':

for i in range(10):

t =my_thread()

t.start()

遞迴鎖以上**的效果是執行緒全部序列執行(哪個執行緒搶到鎖哪個執行,不一定執行緒會按順序執行)

訊號量

作用:同時生成多把鎖,有幾把鎖就能同時執行幾個程序(執行緒),有點類似程序池,不同電視,程序池會一直執行到沒有任務了,開的程序才會死,就是說不管你執行多少任務,給你執行的程序就是原來執行完任務的程序,人家等著你給下乙個任務呢,他還是他一直存活;訊號量是有幾個(程序)執行緒得到鎖後開始執行,執行完就死了,下乙個拿鎖的就執行,但下乙個程序(執行緒)已經不是原來的程序(執行緒)了,他是新的,原來的已經死了

from threading import

thread,semaphore,currentthread

import

time,random

se = semaphore(5)

defwork():

se.acquire()

print('

%s is running

'%currentthread().getname())

time.sleep(random.randint(1,4))

print('

%s is done

' %currentthread().getname())

se.release()

if__name__ == '

__main__':

t_l =

for i in range(30):

t = thread(target=work)

t.start()

for t in

t_l:

t.join()

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

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

訊號量,互斥鎖

注 摘自 程式設計師的自我修養 相關章節。關鍵字 執行緒同步 原子操作 鎖 二元訊號量 訊號量 互斥量 臨界區 讀寫鎖 條件變數 原子操作 共享資料 全域性變數或堆變數 的自增 操作在多執行緒環境下會出現錯誤是因為這個操作 一條c語句 被編譯為彙編 後不止一條指令,因此在執行的時候可能執行了一半就被...

訊號量 互斥鎖

訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型變數則...