我正在为一位哲学家创建一个线程。这是伪代码:
while(true)
think
get left chopstick
get right chopstick
eat
putdown left chopstick
putdown right chopstick
直觉,我认为松开筷子的顺序并不重要。所以先放下左筷子,我能先放下右筷子吗?这会导致任何错误吗?我怀疑它会。如果这导致死锁,怎么办?如果不是,但建议先离开,那为什么?
谢谢!
我正在为一位哲学家创建一个线程。这是伪代码:
while(true)
think
get left chopstick
get right chopstick
eat
putdown left chopstick
putdown right chopstick
直觉,我认为松开筷子的顺序并不重要。所以先放下左筷子,我能先放下右筷子吗?这会导致任何错误吗?我怀疑它会。如果这导致死锁,怎么办?如果不是,但建议先离开,那为什么?
谢谢!
您在这里有几个锁:
while(true)
think
wait until you finished thinking
get left chopstick
get right chopstick
wait until you you took both sticks
eat
putdown left chopstick
putdown right chopstick
锁(等待)之间的事情可以以任何顺序成功,因为它无关紧要。
从视觉上想象它。假设你有四个哲学家,每个人中间都有一根筷子。
四人同时抓起左筷子。这没关系,因为每个人都有一根筷子,没有人争抢一根。
然后他们向右看,筷子已经没有了,因为每个人都有四根中的一根。
他们不能吃东西,所以他们陷入僵局。
如果你这样编码,一段时间后他们放弃并放下筷子,你会遇到同样的问题,因为每个人都试图拿起左边的筷子而没有剩下的右手筷子(时间可能导致这种情况不会发生,但是最好为它编写代码)。
相反,你应该选择一个哲学家,让他先拿起他的右手筷子。这打破了僵局,因为无论是右边的筷子哲学家还是他左边的哲学家都会成功地拿到筷子并能够吃东西(最终会绕着圈子喂饱所有人)。
while(true)
think
identify nearest chopstick set location
think
get nearest chopstick of set
get remaining chopstick of set
eat
putdown left chopstick
putdown right chopstick