互斥鎖遞迴鎖及死鎖現象
阿新 • • 發佈:2020-07-26
互斥鎖遞迴鎖及死鎖現象
from threading import Lock,RLock
# Lock 互斥鎖 效率高
# RLock 遞迴(recursion)鎖 效率相對低
l = Lock()
l.acquire()
print('希望被鎖住的程式碼')
l.release()
rl = RLock() # 在同一個執行緒中可以被acquire多次
rl.acquire()
print('希望被鎖住的程式碼')
rl.release()
from threading import Thread,RLock as Lock def func(i,lock): lock.acquire() lock.acquire() print(i,': start') lock.release() lock.release() print(i, ': end') lock = Lock() for i in range(5): Thread(target=func,args=(i,lock)).start()
死鎖現象
import time from threading import Thread,Lock,RLock # fork_lock = noodle_lock = RLock() noodle_lock = RLock() fork_lock = RLock() def eat(name): noodle_lock.acquire() print(name,'搶到面了') fork_lock.acquire() print(name, '搶到叉子了') print(name,'吃麵') time.sleep(0.1) fork_lock.release() print(name, '放下叉子了') noodle_lock.release() print(name, '放下面了') def eat2(name): fork_lock.acquire() print(name, '搶到叉子了') noodle_lock.acquire() print(name,'搶到面了') print(name,'吃麵') noodle_lock.release() print(name, '放下面了') fork_lock.release() print(name, '放下叉子了') Thread(target=eat,args=('alex',)).start() Thread(target=eat2,args=('wusir',)).start() Thread(target=eat,args=('taibai',)).start() Thread(target=eat2,args=('大壯',)).start()
死鎖現象是怎麼產生的?
多把(互斥/遞迴)鎖 並且在多個執行緒中 交叉使用
fork_lock.acquire()
noodle_lock.acquire()
fork_lock.release()
noodle_lock.release()
如果是互斥鎖,出現了死鎖現象,最快速的解決方案把所有的互斥鎖都改成一把遞迴鎖
程式的效率會降低的
遞迴鎖 效率低 但是解決死鎖現象有奇效
互斥鎖 效率高 但是多把鎖容易出現死鎖現象