死锁现象
1.同一线程对一把锁连续acquire 死锁
2.多把锁(互斥锁,递归锁),并且在多个线程中 交叉使用 会死锁
如果是互斥锁,出现了死锁现象,最快速的解决方法就是把互斥锁变成一把递归锁
或者是把两把互斥锁变成一把互斥锁
互斥锁 效率低 但是会出现死锁现象
from threading import Thread,Lock import time noodle_lock = Lock() fork_lock = Lock() def eat1(name): noodle_lock.acquire() print('%s抢到面了'%name) fork_lock.acquire() print('%s抢到叉子了'%name) print('%s开始吃面了'%name) time.sleep(0.2) fork_lock.release() print('%s放下叉子了' % name) noodle_lock.release() print('%s放下面了了' % name) def eat2(name): fork_lock.acquire() print('%s抢到叉子了' % name) noodle_lock.acquire() print('%s抢到面了' % name) print('%s开始吃面了' % name) time.sleep(0.2) fork_lock.release() print('%s放下叉子了' % name) noodle_lock.release() print('%s放下面了'%name) Thread(target=eat1,args=('aaaa',)).start() Thread(target=eat1,args=('bbbb',)).start() Thread(target=eat2,args=('cccc',)).start() Thread(target=eat2,args=('cccc',)).start()
递归锁 只要拿到最外层的钥匙就能进去里面多个房间
from threading import Thread,RLock import time noodle_lock = fork_lock = RLock() def eat1(name): noodle_lock.acquire() print('%s抢到面了'%name) fork_lock.acquire() print('%s抢到叉子了'%name) print('%s开始吃面了'%name) time.sleep(0.2) fork_lock.release() print('%s放下叉子了' % name) noodle_lock.release() print('%s放下面了了' % name) def eat2(name): fork_lock.acquire() print('%s抢到叉子了' % name) noodle_lock.acquire() print('%s抢到面了' % name) print('%s开始吃面了' % name) time.sleep(0.2) fork_lock.release() print('%s放下叉子了' % name) noodle_lock.release() print('%s放下面了'%name) Thread(target=eat1,args=('AAA',)).start() Thread(target=eat1,args=('BBB',)).start() Thread(target=eat2,args=('CCC',)).start() Thread(target=eat2,args=('DDD',)).start()
互斥锁解决
noodle_fork_lock = Lock() def eat1(name): noodle_fork_lock.acquire() print('%s抢到面了'%name) print('%s抢到叉子了'%name) print('%s开始吃面了'%name) time.sleep(0.2) noodle_fork_lock.release() def eat2(name): noodle_fork_lock.acquire() print('%s抢到叉子了' % name) print('%s抢到面了' % name) print('%s开始吃面了' % name) time.sleep(0.2) print('%s放下叉子了' % name) print('%s放下面了' % name) noodle_fork_lock.release() Thread(target=eat1,args=('AAA',)).start() Thread(target=eat1,args=('BBB',)).start() Thread(target=eat2,args=('CCC',)).start() Thread(target=eat2,args=('DDD',)).start()

浙公网安备 33010602011771号