C 系统V信号量多重递增/递减

C 系统V信号量多重递增/递减,c,linux,semaphore,sysv-ipc,C,Linux,Semaphore,Sysv Ipc,我在读POSIX和SystemV信号量之间的区别,我读了一些关于这方面的文章。在每一篇文章中,这句话都是这样写的: “如果您需要在一个步骤中实现多个增量-减量的原子操作,System V信号量将非常有用。” 我的问题是: 1) 在一个原子操作中需要多个增量/减量是什么?你能举例说明吗 2) 为什么semop允许将值更改为小于-1且大于+1的值?是否有相同的实际用法/示例 (我知道,通过SystemV信号量中的semop()函数,我可以让信号量数组中的多个信号量增加或减少一个指定的值&POSIX信

我在读POSIX和SystemV信号量之间的区别,我读了一些关于这方面的文章。在每一篇文章中,这句话都是这样写的: “如果您需要在一个步骤中实现多个增量-减量的原子操作,System V信号量将非常有用。”

我的问题是:

1) 在一个原子操作中需要多个增量/减量是什么?你能举例说明吗

2) 为什么semop允许将值更改为小于-1且大于+1的值?是否有相同的实际用法/示例

(我知道,通过SystemV信号量中的semop()函数,我可以让信号量数组中的多个信号量增加或减少一个指定的值&POSIX信号量的sem_wait()或sem_post()不能做到这一点。但这两者有什么用?)

我阅读的文章,供您参考:

(一)

(二)

(三)

(四)

更新:

我已经阅读了下面的文章,其中提到了使用semop()对信号量进行多次递增/递减,但我仍然无法获得相同的示例/实际用法。供你参考的文章:

(一)

文章节选: (标题为“多信号量操作示例”)

“SystemV信号量的威力在于,它们可以用于在一次操作中自动检查和设置多个信号量。”

他也给出了一小部分如何做到这一点。但没有相同的实际用途

(二)

作者以“实现一组信号量”为题编写了原子操作中信号量多次递增/递减的代码。这里也没有提到它的实际用途

(三)

这本书的摘录:

在UNIX System V中,信号量机制进行了一些调整。保留了操作原子性。但是操作的加减值可以大于一。(为什么?有什么用?)。而且,当多个进程同时争夺多个不同的资源时,进程可以同时执行多个信号量操作以避免死锁问题。(如何?示例?)

我希望这能使问题更清楚

如果您对所问问题有任何疑问,请发表评论


提前谢谢

多个递增/递减可能很方便的示例:想象一下某种会议系统,其中视频会话需要一个频道播放视频,另一个频道播放声音,但其他会话只使用音频频道。为了控制对通道的访问,可以使用信号量。当一个会话终止时,它应该立即减少它使用的所有信号量,以便将它们释放给其他会话。如果这不是原子级的,视频会议会话可能在启动时能够捕获音频通道,但也太迟了,无法捕获视频通道

第二个问题与负载平衡有关。通过允许[-1..1]以外的其他值,可以将信号量值用作队列大小度量。在上面的会议示例中,如果所有本地通道上的负载都很重,也许您可以将会话重定向到另一个具有自己通道的不太繁忙的主干


希望这能让事情更清楚一点。

嗨,雷恩,谢谢你的回复,但我仍然有以下疑问:1)如果会话终止,它不应该“增加”信号量吗?(很可能是打字错误,但我只是想指出。)2)我从您的解释中了解到,多重递增/递减的原子性将防止出现死锁情况。但这难道不能通过连续进行两次semop操作来避免吗?(以相同的顺序-意味着在每个会话中先减少音频,然后减少视频。)3)我真的不明白如何使用信号量实现负载平衡。据我所知,信号量与任何资源都不相关。。如果可能,请澄清并提供程序证明。谢谢:)