繁体   English   中英

POSIX:退出sem_wait()后的信号量值

[英]POSIX: value of a semaphore after exiting sem_wait()

信号量初始化为值0。

sem_t sem;
sem_init(&sem, 0, 0);

执行的一行等待信号量,而另一行则将其解锁。 首先,是服务生必须等待的情况。

// value is 0
sem_wait(&sem);  // blocks
                                    // value is 0
                                    sem_post(&sem);
                                    // value becomes 1
// unblocked

第二,服务员不必等待的情况。

                                    // value is 0
                                    sem_post(&sem);
                                    // value becomes 1

// value is 1
sem_wait(&sem);  // does not block
// value has become 0

问题在于sem的最终值在两种情况下是不同的:第一种情况下为1,第二种情况下为0。 这是一种比赛条件。

理想情况下,在以下情况下不会发生此问题:

  • 当信号量的值为0并sem_wait() ,该值将变为-1,而不是保持为0。这样,两种情况下的最终值都将为0。
  • 或者,存在sem_post()的变体,它将唤醒一个进程增加该值(如果有正在等待的进程,则该值不会增加)。 同样,两种情况下的最终值均为0

有没有办法解决POSIX中的这种差异?

我会说您对第一种情况的最终假设是错误的。

从阻塞调用返回sem_wait() ,信号量会递减,因此最终的值为0

来自man sem_wait() (我的斜体字 ):

sem_wait()递减(锁定)sem指向的信号量。 如果信号量的值大于零,则减量继续进行,函数立即返回。 如果信号灯当前的值为零,则调用将阻塞, 直到有可能执行减量操作 (即信号灯值升至零以上),或者信号处理程序中断该调用为止

上面的措词不同于POSIX所使用措词 ,但是,这有助于阐明信号量的“值”如何与信号量锁定状态相关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM