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

时间:2015-07-18 09:11:27

标签: c posix semaphore race-condition

信号量初始化为值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中的这种差异?

1 个答案:

答案 0 :(得分:1)

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

从阻塞调用返回到sem_wait()时,信号量会减少,因此最终会得到0的值。

来自我man sem_wait()斜体):

  

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

以上措辞与wording used by POSIX不同,但这有助于阐明信号量的“值”与信号量锁定状态的关系。