[英]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。 这是一种比赛条件。
理想情况下,在以下情况下不会发生此问题:
sem_wait()
,该值将变为-1,而不是保持为0。这样,两种情况下的最终值都将为0。 sem_post()
的变体,它将唤醒一个进程或增加该值(如果有正在等待的进程,则该值不会增加)。 同样,两种情况下的最终值均为0 有没有办法解决POSIX中的这种差异?
我会说您对第一种情况的最终假设是错误的。
从阻塞调用返回sem_wait()
,信号量会递减,因此最终的值为0
。
来自man sem_wait()
(我的斜体字 ):
sem_wait()递减(锁定)sem指向的信号量。 如果信号量的值大于零,则减量继续进行,函数立即返回。 如果信号灯当前的值为零,则调用将阻塞, 直到有可能执行减量操作 (即信号灯值升至零以上),或者信号处理程序中断该调用为止 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.