死锁现象

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()

 

posted @ 2021-02-04 22:31  苦行僧冬*婷  阅读(59)  评论(0)    收藏  举报