我正在阅读 POSIX 和 System V 信号量之间的区别,并且阅读了一些关于相同内容的文章。在每篇文章中都写着这样的声明: “如果您需要在一个步骤中实现具有多个递增-递减的原子操作,那么 System V 信号量是有益的。”
我的问题是:
1) 在单个原子操作中需要多次递增/递减是什么?能举个例子解释一下吗?
2)为什么semop允许值被小于-1和大于+1的值改变?是否有相同的实际用法/示例?
(我知道使用 System V 信号量中的 semop() 函数,我可以让信号量增加或减少一个指定的值,而不是信号量数组中的一个信号量,而 sem_wait() 或 sem_post 不能做到这一点() 的 POSIX 信号量。但是它有什么用呢?)
我看过的文章,供大家引用:
1) http://www.ibm.com/developerworks/library/l-semaphore/
2) Differences between System V and Posix semaphores
3) http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=4
4) http://linuxtips.pbworks.com/w/page/29023300/SystemV%20vs%20Posix%20IPC
更新:
我已经阅读了以下文章,其中提到了使用 semop() 对信号量进行多次递增/递减,但我仍然无法获得相同的示例/实际用法。供您引用的文章:
1) http://kaharris.org/teaching/51081/Assignments/Final/systemV.pdf
文章摘录: (在标题“多个信号量操作示例”下)
“System V 信号量的强大之处在于它们可用于在一次操作中自动检查和设置多个信号量。”
他也给出了一小段如何做到这一点。但没有相同的实际用法。
2) http://www.anirudhtom.com/2011/02/system-v-semaphores-for-babies.html
作者在标题为“IMPLEMENTING A SET OF SEMAPHORE”下编写了一个原子操作中信号量的多次递增/递减的代码。同样的实际使用这里也还是不说了。
本书摘录:
"在UNIX System V中,信号量机制做了一些调整。保留了操作的原子性。但是操作的加减值可以大于1。(为什么?有什么用?)。甚至更多,进程可以当多个进程同时竞争多个不同的资源时,同时进行多个信号量操作以避免死锁问题。(如何?示例?)”
我希望这能让问题更清楚。
如果您对提出的问题有任何疑问,请发表评论。
提前致谢!
最佳答案
多个增量/减量可能很方便的示例:想象一下某种 session 系统,其中视频 session 需要一个 channel 用于视频,另一个 channel 用于声音,但其他 session 仅使用音频 channel 。为了控制对 channel 的访问,可以使用信号量。当一个 session 终止时,它应该立即递减它使用的所有信号量,以便为其他 session 释放它们。如果这不是原子的,则视频 session session 在开始时可能能够获取音频 channel ,但为时已晚,无法再获取视频 channel 。
你的第二个问题与负载均衡有关。通过允许 [-1..1] 以外的其他值,您可以将信号量值用作队列大小计量器。在上面的 session 示例中,如果所有本地 channel 上的负载都非常重,也许您可以将您的 session 重定向到另一个具有自己 channel 的不太繁忙的中继。
希望这能让它更清楚一些。
关于c - System V 信号量多次递增/递减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057316/