首页 > 其他 > 详细

互斥锁递归锁及死锁现象

时间:2020-07-26 19:17:09      阅读:63      评论:0      收藏:0      [点我收藏+]

互斥锁递归锁及死锁现象

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()
如果是互斥锁,出现了死锁现象,最快速的解决方案把所有的互斥锁都改成一把递归锁
程序的效率会降低的
递归锁 效率低 但是解决死锁现象有奇效
互斥锁 效率高 但是多把锁容易出现死锁现象

互斥锁递归锁及死锁现象

原文:https://www.cnblogs.com/wyh0717/p/13379899.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!