最近操作系统刚学完这部分内容,老师要求下去自己实践一下,在网上看了看发现用python解决该问题的博文很少,而且好多都是错的,于是就自己写了一段代码
# and型信号量解决哲学家就餐问题
import time
import threading
class Philosophy(threading.Thread):
def __init__(self, key, lefthand, righthand, hungry):
threading.Thread.__init__(self)
self.key = key # 哲学家编号
self.lefthand = lefthand # True表示哲学家左手拿起筷子,False表示哲学家左手没有拿起筷子
self.righthand = righthand
self.hungry = hungry # True表示哲学家饿了
def pick(self):
threadLock.acquire()
if chopsticks[self.key] and chopsticks[(self.key + 1) % 5] and not self.lefthand and not self.righthand and self.hungry: # 可以拿筷子
time.sleep(5)
chopsticks[(self.key + 1) % 5] = False
self.lefthand = True
print('哲学家%s拿起了左边的筷子!' % self.key)
time.sleep(5)
chopsticks[self.key] = False # 哲学家的筷子被拿
self.righthand = True # 哲学家右手拿起筷子
print('哲学家%s拿起了右边的筷子!' % self.key)
threadLock.release()
def eat(self):
if self.lefthand and self.righthand and self.hungry: # 可以开始吃饭
time.sleep(5)
print('哲学家%s开始吃饭' % self.key)
time.sleep(5)
print('哲学家%s吃完饭了' % self.key)
self.hungry = False
time.sleep(5)
print('哲学家%s放下筷子开始思考' % self.key)
self.lefthand = False # 哲学家左手放下筷子
self.righthand = False # 哲学家右手放下筷子
chopsticks[self.key] = True # 哲学家的筷子可以用
chopsticks[(self.key + 1) % 5] = True # 哲学家右边的筷子可以用
def run(self):
while True:
self.pick()
self.eat()
threadLock = threading.Lock()
chopsticks = [True, True, True, True, True]
philosophy0 = Philosophy(0, False, False, True)
philosophy1 = Philosophy(1, False, False, True)
philosophy2 = Philosophy(2, False, False, True)
philosophy3 = Philosophy(3, False, False, True)
philosophy4 = Philosophy(4, False, False, True)
philosophy0.start()
philosophy1.start()
philosophy2.start()
philosophy3.start()
philosophy4.start()
结果如下:
哲学家0拿起了左边的筷子!
哲学家0拿起了右边的筷子!
哲学家0开始吃饭
哲学家2拿起了左边的筷子!
哲学家2拿起了右边的筷子!
哲学家0吃完饭了
哲学家2开始吃饭
哲学家0放下筷子开始思考
哲学家4拿起了左边的筷子!
哲学家2吃完饭了
哲学家2放下筷子开始思考
哲学家4拿起了右边的筷子!
哲学家4开始吃饭
哲学家1拿起了左边的筷子!
哲学家4吃完饭了
哲学家1拿起了右边的筷子!
哲学家4放下筷子开始思考
哲学家1开始吃饭
哲学家3拿起了左边的筷子!
哲学家1吃完饭了
哲学家3拿起了右边的筷子!
哲学家1放下筷子开始思考
哲学家3开始吃饭
哲学家3吃完饭了
哲学家3放下筷子开始思考