一般信号量的范围是多少。我知道它可以取负值,0 和 1。
负值表示阻塞队列中阻塞的进程数。 0 表示没有进程在块中,1 表示有一个可用资源没有进程抢占它我想知道它的值是否可能大于 1。(例如 2)这是什么意思?这是否意味着我们有多个资源用于单个信号量?
最佳答案
您应该准确指定您正在谈论的信号量类型。 Linux 支持内核信号量、POSIX 信号量和 System V 信号量。
System V 信号量 API 记录了信号量值不能小于 0。
POSIX 信号量 API 记录“如果 sem 被锁定,则 sval 指向的对象应设置为零或负数,其绝对值表示在调用期间某个未指定时间等待信号量的进程数” .看起来 POSIX 信号量的 glibc 实现不允许信号量计数/值降至零以下。
Linux 内核信号量曾经有一个使用负计数跟踪服务员的实现 - 这是在 Bovet & Cesati 的“理解 Linux 内核”一书中记录的实现。然而,在 2.6 内核进化的某个时刻(我认为在 2.6.11 之后和 2.6.32 之前的某个时候)实现发生了变化,因此信号量值不会降到零以下。
因此,所有信号量都允许计数大于零,这表示可以同时获取一定数量的资源。信号量计数是否可以低于零是一个实现细节——就等待资源而言,这些信号量的行为与不让计数降至零以下的信号量实现相同。
但是信号量计数大于 1 的用例非常少见。正如 Linus Torvalds 在新闻组帖子 ( http://yarchive.net/comp/linux/semaphores.html ) 中所说:
关于c - 什么是一般信号量范围?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20656295/