今日内容
死锁和递归锁
死锁:指两个或两个以上的进程或线程在执行过程中,因资源而导致的一种彼此等待的事件,若无外力作用,它们将无法继续下去
死锁经典问题
哲学家吃面
def eat1(lock1,lock2,name):
lock1.acquire()
print('%s抢到了筷子'% name)
time.sleep(1)
lock2.acquire()
print('%s抢到了面条'% name)
time.sleep(1)
print('开始吃了')
time.sleep(2)
lock2.release()
print('面条吃完了')
lock1.release()
def eat2(lock2,lock1,name):
lock2.acquire()
print('%s抢到了面条'% name)
time.sleep(1)
lock1.acquire()
print('%s抢到了筷子'% name)
time.sleep(1)
print('开始吃了')
time.sleep(2)
lock1.release()
print('筷子放下了')
lock2.release()
if __name__ == '__main__':
lock1 = Lock()
lock2 = Lock()
for i in ['1','2','3']:
t = Thread(target=eat1,args=(lock1,lock2,i))
t.start()
for i in ['4','5','6']:
t = Thread(target=eat2,args=(lock2,lock1,i))
t.start()
利用递归锁解决该问题
def eat1(lock1,lock2,name):
lock1.acquire()
print('%s抢到了筷子'% name)
time.sleep(1)
lock2.acquire()
print('%s抢到了面条'% name)
time.sleep(1)
print('开始吃了')
time.sleep(2)
lock2.release()
print('面条吃完了')
lock1.release()
def eat2(lock2,lock1,name):
lock2.acquire()
print('%s抢到了面条'% name)
time.sleep(1)
lock1.acquire()
print('%s抢到了筷子'% name)
time.sleep(1)
print('开始吃了')
time.sleep(2)
lock1.release()