【问题标题】:What is the consensus number for semaphores?信号量的共识数是多少?
【发布时间】:2009-04-21 15:34:47
【问题描述】:

(我认为)互斥体的 consensus number 是 2。

信号量的共识数是多少(例如在 pthread_sem_* 中)?

条件变量的共识数是多少(例如在 pthread_cond_* 中)?

【问题讨论】:

  • 什么是“共识号”?
  • 我认为信号量是一个挥舞旗帜的信号系统。比如,“救命,我们的船正在下沉!” :)
  • 那张纸看起来非常棒。我想知道为什么我以前没见过它。
  • 这篇论文规则太多,在我看来,它阻止了其他人解决类似问题......对于 DSM 同步理论来说太糟糕了。

标签: synchronization pthreads mutex semaphore condition-variable


【解决方案1】:

互斥体的共识数为 1。很明显,互斥体对于单个线程是无等待的。从它的定义来看,互斥体不再对两个线程无等待。因此共识数是 >=1 和

同样,通过停止一个线程以支持另一个线程的其他同步机制也具有共识编号 1,因此不能用于构造由 2 个线程共享的无等待对象。

【讨论】:

    【解决方案2】:

    答案取决于互斥体或信号量上支持的操作。如果只支持阻塞锁,则共识数为1。如果一个线程可以尝试锁定互斥锁而不等待,则共识数为2。那是因为如果有两个线程,都可以尝试锁定互斥锁,两者都可以同意哪一个得到它,所以有共识。如果互斥锁可以额外确定,对于任意数量的线程,哪个线程锁定了它,那么共识数是无限的。我认为信号量的情况类似。互斥量相当于带有计数器 1 的信号量。我认为仅使用更大的计数器就无法达成共识,它仍然归结为相同的操作。 Pthreads 支持非阻塞锁但不支持查询,所以答案是 2。

    如果任何线程没有等待它,则向条件变量发出信号不会执行任何操作,因此它们的共识编号为 1。

    【讨论】:

      【解决方案3】:

      肯定是无限的吧?但他们不是免费等待的。

      也许我误会了。您说互斥体的共识数为 2 - 您的来源是什么?它的设计目的是允许任意数量的线程共享资源,并以阻塞为代价。

      Atomic test-and-set 的共识数为 2,但不会阻塞。


      澄清一下:信号量、互斥体等是原语,您可以简单地将共享资源包装起来以使其安全(只要您正确执行)。他们可能会阻止,但他们会保证您的数据是安全的。

      您引用的论文是关于保护数据无阻塞所需的原语,即hard。相同的原语也可能对锁有用,但这只是一个不错的附加功能。

      【讨论】:

      • 你也许是对的......我认为互斥体的共识数为 2,因为我只能通过 test&set 来实现它。我认为不可能仅使用互斥锁来实现信号量。我需要比条件变量更强大的东西。
      • 所以互斥体的“最小”共识数是 2。信号量的“最小”共识数是多少?
      • 但是互斥锁的实现不会是无等待的。您将使用 TAS 指令。
      • (抱歉,不小心删除了该评论)
      • 我必须承认,我只是略读了这篇论文,但它是关于分析无等待同步的。我不认为共识数字与任何阻止的东西真正相关。
      【解决方案4】:

      仅从本文中,您就可以得出结论,信号量的共识数必须小于或等于 2。原因如下:

      在文章的第三页他们说:“fetch&add 操作非常灵活:它可以用于信号量......”。由于我们知道 fetch&add 的共识数等于 2,因此可以使用该论文的定理 1 来证明信号量的共识数必须小于或等于 2。证明如下:


      证明

      假设存在通过 fetch&add 实现的信号量的无等待实现。进一步假设信号量的共识数大于 2。我们知道 fetch&add 的共识数为 2。从定理 1 我们可以得出结论,在超过 2 个进程的系统中不存在通过 fetch&add 实现的信号量的无等待实现.这与存在 fetch&add 实现的假设相矛盾。因此,一个信号量的共识数必须小于或等于 2。

      QED

      【讨论】:

      • 嗯.. 我很确定你不能用互斥锁实现信号量,你还需要条件变量或其他方式来原子地解锁互斥锁并进入队列。
      • 最后一步没有跟随。我可以通过比较和交换来实现互斥锁。这是否使它无限?或者我可以只用一组来实现互斥锁,这只对一个进程是安全的。本文的重点是研究非阻塞原语,而互斥锁不是。
      • @Helltone 证明不依赖于信号量与互斥体的实现;它依赖于 fetch&add。但是,您错了:您可以使用互斥锁实现信号量。 picturel.com/ucr/node32.html。我不明白为什么依赖条件变量来实现意味着你无法实现它。
      • @Mark 你倒退了。如果您可以仅使用 Y 实现 X,则证明 Y 的共识数最多是 Y 的共识数。证明正确地指出,由于您可以使用 fetch-and-add 实现信号量,并且 fetch-and-add 的共识数and-add 为 2,信号量的共识数≤2。同样,由于您可以通过比较和交换来实现互斥体,因此互斥体的共识数最多是比较和交换的共识数。
      • 据我所知,条件变量确实将共识数增加到 2,而仅使用互斥锁时只有 1 个。我现在正在寻找参考资料。
      猜你喜欢
      • 2014-01-06
      • 2012-02-06
      • 2019-06-08
      • 1970-01-01
      • 2014-02-23
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多