在Linux内核中,信号量用于为关键数据段提供互斥,并使用完成变量在等待事件的2个线程之间进行同步。为什么不使用信号量进行这种同步?在信号量上使用完成变量有什么优势?完成变量和信号量之间的差异
7
A
回答
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
相关问题
- 1. 差异之间++变量,变量++
- 2. 互斥量和信号量之差= 1?
- 3. 类变量和实例变量之间的差异
- 4. 全局变量和对象变量之间的速度差异
- 5. 完成()和this.finish()之间的差异android
- 6. 变量的值之间的差异
- 7. TensorFlow变量和TensorFlow张量之间的实现差异
- 8. HUGE_VALF和INFINITY常量之间的差异
- 9. 信号量计数器和信号量方法之间的理解差异整数参数?
- 10. 信号量和R/W信号量之间的性能评估
- 11. C#,物业之间的差异变和不变量
- 12. 告诉松弛变量和原始变量之间的差异Z3
- 13. jQuery的变量,之间的差异有和没有$前缀
- 14. 设置为零和0的变量之间的差异
- 15. 关于引用变量,select和group_by之间的Dplyr差异?
- 16. $ Session变量和Getter/Setter之间的差异
- 17. fzero和fsolve之间的差异对于一个变量
- 18. 单例和全局变量之间的差异
- 19. 变量差异
- 20. 不理解变量声明,符号,方法,实例变量,类变量之间的差异
- 21. 计算行向量和平均行向量之间的差异?
- 22. R编程:向量之间的差异
- 23. 量化数组之间的差异order
- 24. 大量行之间的差异
- 25. PyQt4的cellPressed和cellClicked信号之间的差异QTableWidget
- 26. 字符串为二进制,常量和变量之间的转换差异
- 27. 局部变量,实例变量和符号之间的混淆
- 28. jQuery $变量差异
- 29. **变量和变量[] []之间的区别?
- 30. 成员和方法之间的差异
需要注意的是POSIX一致性信号量实现可以避免Linux内核信号量在这种用法情况下的竞争,只要您有原子比较,就可以使其达到最佳状态,并且 - 交换操作。看到我关于这个主题的问题以及到达的解决方案。 – 2012-01-03 05:36:22