【发布时间】:2015-07-18 09:11:27
【问题描述】:
信号量被初始化为 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 中的这种差异?
【问题讨论】:
标签: c posix semaphore race-condition