哲学家就餐问题python代码
时间: 2023-07-23 18:03:29 浏览: 56
这里是哲学家就餐问题的Python代码,使用线程和锁实现:
```python
import threading
class Fork:
def __init__(self, id):
self.id = id
self.lock = threading.Lock()
def pick_up(self):
return self.lock.acquire(False)
def put_down(self):
self.lock.release()
class Philosopher(threading.Thread):
def __init__(self, id, left_fork, right_fork):
threading.Thread.__init__(self)
self.id = id
self.left_fork = left_fork
self.right_fork = right_fork
def run(self):
while True:
# Pick up left fork
left = self.left_fork.pick_up()
# Pick up right fork
right = self.right_fork.pick_up()
# If both forks are available, eat
if left and right:
print(f"Philosopher {self.id} is eating")
# Put down right fork
self.right_fork.put_down()
# Put down left fork
self.left_fork.put_down()
if __name__ == '__main__':
num_philosophers = 5
forks = [Fork(i) for i in range(num_philosophers)]
philosophers = [Philosopher(i, forks[i], forks[(i+1)%num_philosophers]) for i in range(num_philosophers)]
for p in philosophers:
p.start()
for p in philosophers:
p.join()
```
在这个实现中,每个哲学家都是一个线程,在运行时不断尝试获取左右两边的叉子。如果叉子都可用,则开始进餐;否则,先放下左边的叉子,等待下一轮循环。注意到,在实现中,我们使用了 `Lock` 类型的对象来保证线程安全,确保同一时刻最多只有一个哲学家能够持有同一把叉子。