Python 互斥鎖 遞迴鎖 死鎖機制詳解

2021-09-11 09:01:51 字數 2177 閱讀 8073

互斥鎖:犧牲了執行效率而獲得資料安全

問題:

# 多個執行緒搶占資源,會發生資料混亂

from threading import thread

import os,time

def work():

global n

temp=n

time.sleep(0.1)

n=temp-1

if __name__ == '__main__':

n=100

l=for i in range(100):

p=thread(target=work)

p.start()

for p in l:

p.join()

print(n) #結果可能為99

解決:

# 引入鎖(lock)的介入,一把鑰匙配一把鎖

from threading import thread,lock

import os,time

def work():

global n

lock.acquire()

temp=n

time.sleep(0.1)

n=temp-1

lock.release()

if __name__ == '__main__':

lock=lock()

n=100

l=for i in range(100):

p=thread(target=work)

p.start()

for p in l:

p.join()

print(n) #結果肯定為0,由原來的併發執行變成序列,犧牲了執行效率保證了資料安全

死鎖:

# 這時fork的鎖拿到了一些資源,noodle拿到了一些資源,互不相讓,造成死鎖

import time

from threading import thread,lock

fork_lock = noodle_lock = lock()

fork_lock.acquire()

print(222)

noodle_lock.acquire()

print(333)

fork_lock.release()

noodle_lock.release()

print(111)

遞迴鎖:解決死鎖

import time

from threading import thread,rlock

fork_lock = noodle_lock = rlock()

def eat1(name):

# 死鎖就是noodle_lock搶到的鑰匙也能開啟下面的fork_lock

noodle_lock.acquire()

print('%s 搶到了麵條111'%name)

fork_lock.acquire()

print('%s 搶到了叉子222'%name)

print('%s 吃麵333'%name)

fork_lock.release()

noodle_lock.release()

def eat2(name):

# 這個相當於跟上面的遞迴鎖是同一級的,所以上面搶到了,這個必須等到上述遞迴鎖的counter為0

# 也就是所有的資源都release掉了之後,才釋放資源

fork_lock.acquire()

print('%s 搶到了叉子555' % name)

time.sleep(1)

noodle_lock.acquire()

print('%s 搶到了麵條666' % name)

print('%s 吃麵777' % name)

noodle_lock.release()

fork_lock.release()

for name in ['哪吒','egon','yuan']:

t1 = thread(target=eat1,args=(name,))

t2 = thread(target=eat2,args=(name,))

t1.start()

t2.start()

互斥鎖遞迴鎖及死鎖現象

from threading import lock,rlock lock 互斥鎖 效率高 rlock 遞迴 recursion 鎖 效率相對低 l lock l.acquire print 希望被鎖住的 l.release rl rlock 在同乙個執行緒中可以被acquire多次 rl.acqu...

鎖 互斥鎖,死鎖

當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀態變...

python 互斥鎖,死鎖

同步與非同步之間的區別 1.同步 可以理解為執行緒a和b一塊配合工作,a執行到一定程度時要依靠b的某個結 果,於是停下來示意b執行,b執行完將結果給a,然後a繼續執行。2.非同步 非同步是指程序不需要一直等待下去,而是繼續執行下面的操作,不管其他程序的狀態,當有資訊返回的時候會通知程序進行處理,這樣...