2011-01-21 94 views
7

在Linux内核中,信号量用于为关键数据段提供互斥,并使用完成变量在等待事件的2个线程之间进行同步。为什么不使用信号量进行这种同步?在信号量上使用完成变量有什么优势?完成变量和信号量之间的差异

回答

9

有你可能想使用两个原因完成而不是信号量。首先,多个线程可以等待完成,并且可以通过一次调用complete_all()来释放它们。让一个信号量唤醒未知数量的线程会更复杂。其次,如果等待的线程将释放同步对象,则如果使用信号量,则会出现竞争条件。也就是说,服务员可能会在唤醒线程完成up()之前被唤醒并释放对象。完成时不存在此种族。 (请参见Lasse的文章)

12

为什么完井最初执行说明: http://lkml.indiana.edu/hypermail/linux/kernel/0107.3/0674.html

的基本总结,我们必须通过具有的堆栈上的锁定 信号灯等待 某些事件这 (很常见)的方式服务员, ,然后让服务员做一个 “down()”,导致它阻止 ,直到它正在等待的东西做了 “up()”。

这工作得相当好,这对SMP一个 真小(不太可能)赛事 ,也没有那么多的 比赛的想法本身,作为 实现信号量的。我们 可能有固定的信号量,但 有不有几个原因:对于非竞争的情况下

  • 的信号灯优化(故意)。 的“等待完成”用法有 相反默认情况下
  • 的信号量是相当复杂和具体的架构,正是
    由于这种优化。试图 改变他们是痛苦的地狱。

所以不是,我介绍的 概念“等待完成”:

最近的线程约完井VS信号灯 http://lkml.org/lkml/2008/4/11/323

+0

需要注意的是POSIX一致性信号量实现可以避免Linux内核信号量在这种用法情况下的竞争,只要您有原子比较,就可以使其达到最佳状态,并且 - 交换操作。看到我关于这个主题的问题以及到达的解决方案。 – 2012-01-03 05:36:22

相关问题