多出列队列队列的确切共识号是什么?
我知道至少2 :
queue.enq(1)
queue.enq(0)
线程A和B每次调用queue.deq()
获得1的线程将返回它自己的值
得到0的线程将返回另一个值。
但我如何证明正好2 ? 我想我应该只使用2个共识对象来实现一个队列,但我没有设法做到这一点。
答案 0 :(得分:1)
我认为Adar Hefer's的答案是正确的。我个人认为,这些正式答案还是很痛苦的。
作为非正式答案。如果您必须使用FIFO队列就多个线程达成共识,您将如何处理?因此,您可以在此处存储三个或更多提议。比起WIN,LOSE或第二个LOSE,您可以吸管更多。还是没问题。但是,您如何获得正确的“投票”价值?对于WIN,您只需获取您的threadID,但是如何确保其他两个线程也都获得获胜者的价值?如果您是一个失败的线程,从您的角度来看,您将无法看到其他两个线程中的哪个已获胜。您所知道的就是您已经迷路了,应该考虑其他建议的价值。将其赌博掉,您可能会绘制正确的图像-您可能不会。
答案 1 :(得分:0)
假设它可以解决3个线程的共识。 考虑所有可能的线性化并发执行的树中的临界状态。 左转,你决定1.一个权利,你决定0。
假设队列中的线程A deq(),然后是队列中的B deq()。现在我们采取左分支。 然后假设线程B deq()来自队列,然后是来自队列的A deq()。现在我们采取了正确的分支。
现在,如果线程C deq()来自队列,那么它应该不关心其他deq()'无论哪种方式,队列看起来都一样。
矛盾:线程C将决定两个不同的东西,即使执行相同也是如此。