我被要求为python中的餐饮哲学家问题写一个简单的解决方案。这本身似乎很直接但是有些困惑,因为我被要求编写一个非阻塞解决方案。在这种情况下,我不确定这是什么意思。
是否有人能够提供任何提示或指出我正确的方向?
答案 0 :(得分:3)
以下是非阻塞算法的定义:http://en.wikipedia.org/wiki/Non-blocking_algorithm。
此问题的非阻塞解决方案的伪代码:
# The number of forks.
FORKS_COUNT = ...
# Indicates if the i-th fork is taken or not.
taken = new bool[FORKS_COUNT]
# The philosopherId is a position at the table.
def haveDinner(philosopherId):
leftFork = philosopherId
rightFork = (philosopherId + 1) % FORKS_COUNT
if leftFork > rightFork:
swap(leftFork, rightFork)
while true:
# Tries to take the left fork.
while not compare_and_swap(taken[leftFork], false, true):
# Do nothing.
# Tries to take the right fork.
while not compare_and_swap(taken[rightFork], false, true):
# Do nothing.
# Eats.
...
# Returns the forks to the table.
compare_and_swap(taken[leftFork], true, false)
compare_and_swap(taken[rigthFork], true, false)
此解决方案使用compare-and-swap成语。
答案 1 :(得分:2)
在问题的上下文中,非阻塞意味着没有死锁。也就是说,一个哲学家不会无限期地暂停等待一个叉子而已经持有另一个叉子。暂停意味着线程被禁用以用于调度目的,并且在另一个线程专门恢复被挂起的线程之前不会执行。解决方案必须避免无限期暂停或死锁(即,2个或更多线程暂停等待彼此继续)。
该解决方案要求仲裁员可以原子地授予两个分支或拒绝请求。如果哲学家不能原子地接受两种分支,那么哲学家必须在一段随机的时间内思考生命,宇宙和其他一切。在思考之后,哲学家再次请求仲裁员以原子方式获得两个叉子。在放弃两个叉子之前,吃饭也会延迟一段时间。所有随机延迟都是有限的,有一个共同的上限,比如10秒或10分钟,无论如何。
此设计需要比较和交换机制来检查和有条件地更新位掩码,每个分叉一位。机制是原子的。两个位都被更新或者都没有更新。
java中的一个示例解决方案,适用于任意数量的哲学家,它们只使用volatile字段而没有synchronized()块或暂停锁,可在以下位置获得: sourceforge.net/projects/javamutex /
答案 2 :(得分:0)
餐饮哲学家的问题是,你有N个philsophers坐在圆桌旁,每个哲学家之间有一个分叉。如果一个哲学家想咬一口,那么他或她必须拿起他们旁边的两个叉中的一个,然后另一个叉。在哲学家拿了一个字节后,他或她把两个叉子放下来。
如果每个哲学家都拿起他们的左叉,这个场景将会阻止。然后没有人可以拿起正确的叉子吃,他们都饿死了。一个解决方案是让每个哲学家从拿起左叉开始,除了一个从拾取右叉开始的人。