1. 程式人生 > 實用技巧 >互斥鎖遞迴鎖及死鎖現象

互斥鎖遞迴鎖及死鎖現象

互斥鎖遞迴鎖及死鎖現象

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()
如果是互斥鎖,出現了死鎖現象,最快速的解決方案把所有的互斥鎖都改成一把遞迴鎖
程式的效率會降低的
遞迴鎖 效率低 但是解決死鎖現象有奇效
互斥鎖 效率高 但是多把鎖容易出現死鎖現象