定律1:我们知道,在任何一张左撇子和右撇子哲学家混合的桌子上,僵局都不会发生。我非常熟悉它的证明。
最近我在采访中遇到了以下问题。
有五位哲学家坐在圆桌旁。两个筷子之间各有一个哲学家。每个哲学家都需要两支筷子吃饭。我们有两种哲学家:左撇子和右撇子。左手先用左手拿筷子。右手先用右手拿筷子。假设五位哲学家中至少有一位左撇子和一位右撇子。以下哪一项是正确的:
a) 独立于圆桌会议上的哲学家组合,没有僵局。(我肯定是真的)
b) 如果所有的哲学家同时使用第一双筷子,就会出现僵局。(我认为这是真的,因为这意味着如果我们有--
任何专家都能帮我,我的论点是真的吗?
编辑1:我为引理1添加了证据:(但是上面提到的问题有一些不同。)
首先观察到,由于桌子周围的资源获取模式,只有一个可能的等待周期,即涉及所有哲学家的周期。所以假设这样一个僵局。每个哲学家都必须等待,我们的意思是等待别人拿着的筷子。所以所有的筷子都必须拿着。如果我们的桌子上混合了左撇子和右撇子的哲学家,那么必须至少有一对相邻的反撇子哲学家。首先假设一个左撇子哲学家(“莱尼”)坐在一个右撇子哲学家(“罗杰”)的左边。因为所有的筷子都必须拿着,莱尼或罗杰必须拿着夹在他们之间的筷子。如果莱尼拿着它,那就是他的“右筷子”,所以他以前一定是拿过左边的筷子。因此,莱尼拿着两支筷子,并没有等待获得任何(他正在吃),所以没有僵局。如果罗杰拿着夹在他们之间的筷子,那就是他的“左筷子”,那么他之前一定已经获得了右手的筷子,等等。如果我们把前面的例子称为“向外延伸”的例子,那么“向内延伸”的例子就是一个坐在左手哲学家左边的右手哲学家。再说一次,如果我们陷入僵局,所有的筷子都必须拿着,所以其中一个拿着筷子。这意味着另一个人没有拿筷子,因为他们中间的那一个是各自试图获得的第一个筷子(要么罗杰右手拿着,要么莱尼左手拿着;另一个在向外拿之前等待着)。如果有n个哲学家和n个筷子,所有的筷子都被拿着,但是一个哲学家拿着零根筷子,那么n−1.哲学家拿着n根筷子。有些哲学家必须拿两根筷子;那位哲学家没有等待(他正在吃饭),所以没有僵局。
下面是一个例子:
一个左撇子哲学家,四个右撇子哲学家:如果所有人都拿起一根筷子,一个左撇子哲学家赢得了争夺左手边筷子的斗争,他有一根筷子,右手边的一根仍然是免费的。在下一次迭代中,他或他的右手邻居将拿起最后一根免费的筷子。不管怎样,至少有一个哲学家有两根筷子可以吃。--
假设是,没有一个哲学家试图拿起“外向”的筷子,除非他已经获得了“内向”的筷子。
现在让我们来剖析问题b):如果所有的哲学家都能在同一时间点获得一根筷子,那么所有的哲学家要么是左撇子,要么都是右撇子。因为这样就没有为一根筷子而斗争,每个哲学家都有一根筷子。但这违反了你的前提条件:至少有一个左撇子和一个右手哲学家。
假设除了一个人之外,所有人都是右撇子,两个哲学家会为一根筷子而挣扎。一个人会失去这场斗争,无法拿起筷子。因此,“同时拿起筷子”的条件不能满足。正如您正确指出的那样,暗示的先决条件是false,因此,暗示的计算结果为true。
所以回答你的问题:是的,你的推理是正确的。
我在为一个哲学家创建一个线程。下面是伪代码: 凭直觉,我认为松开筷子的顺序无关紧要。那么,如果先放下左筷子,我可以先放下右筷子吗?这会导致任何错误吗?我怀疑它会。如果这导致死锁,如何解决?如果不是,但建议先左,为什么? 非常感谢。
生产者/消费者和读者/作家很容易想到,但是餐饮哲学家呢?在什么样的情况下,N个进程和N个资源会躺在环形拓扑上并相互交错?我可以想到N个进程竞争M个资源,但是在这种情况下,每个进程可以使用任何两个资源。 维基说Dijkstra用它来模拟竞争磁带驱动器外围设备的计算机。这种情况在现代还存在吗?
本文向大家介绍餐饮哲学家问题(DPP),包括了餐饮哲学家问题(DPP)的使用技巧和注意事项,需要的朋友参考一下 餐饮哲学家的问题指出,有5位哲学家共享一张圆桌,他们交替吃饭和思考。每个哲学家都有一碗饭和5根筷子。哲学家需要左右筷子才能吃饭。饿了的哲学家只有在两把筷子都齐备的情况下才可以吃东西,否则哲学家放下筷子,重新开始思考。 餐饮哲学家是一个经典的同步问题,因为它演示了一大类并发控制问题。 餐饮
本文向大家介绍xml 撇号和引号,包括了xml 撇号和引号的使用技巧和注意事项,需要的朋友参考一下 示例 属性值可以用单引号或双引号出现。适当的字符必须转义。
试图遍历一棵树并为我的数组获取空值。我需要遍历只允许访问节点类的类定义中没有根的右和左子级的树。 它需要输入 这应该返回[1,2,4,3,5],我得到了[]。我也尝试过像这样循环 这也不管用。这也会给我一个[]数组。遍历应该从左到右在树高(即树高)指示的树级别上打印树。有什么想法吗?
我试图解决哲学家进餐的问题,每次打印出来只有两个人在吃饭。我创建的每个线程都是一个哲学家,每个部分都是一个叉子,根据算法,每次我们派一个哲学家,我们都试图得到他的叉子(第一次是叉子1和叉子2),叉子是关键部分。你知道怎么解决这个问题吗?这是我的密码: 这就是主要问题: