c - System V 信号量多次递增/递减

标签 c linux semaphore sysv-ipc

我正在阅读 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”下编写了一个原子操作中信号量的多次递增/递减的代码。同样的实际使用这里也还是不说了。

3) http://books.google.co.in/books?id=-Mq5ve5KHXQC&pg=PA109&lpg=PA109&dq=system+v+semaphore+multiple&source=bl&ots=SsdKqyG-Kp&sig=Y7AGqHrsOWaOk8EvCX2dH2RqEnA&hl=en&sa=X&ei=RVomVK-pIIuEuwSV0ILwBQ&ved=0CDQQ6AEwBDgU#v=onepage&q=system%20v%20semaphore%20multiple&f=false

本书摘录:

"在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/

相关文章:

C++ 持有多个线程

c - sem_wait 和信号处理程序

c - 我的代码使用 fseek() 写入文件时出错

c - 在 printf 语句中插入 'n' 制表符

node.js - Docker 不更新目录中的更改

c - 编译器如何以及为什么将 extern 函数替换为空函数?

c - MPI创建的进程的共享内存访问控制机制

c - printf 正在打印 double - c 编程

c - 使用 pipe 和 fork 在 C 语言中编程?

python - 在 chrome 中运行 Selenium WebDriver python 绑定(bind)