【发布时间】:2011-05-30 09:32:16
【问题描述】:
圣诞快乐!
我正在阅读The Little Book of Semaphores。书中有一个用 C 语言实现的信号量,我并不完全理解。请参阅下面的代码。有这个 wakeups 变量。作者解释:
wakeups 计算待处理信号的数量;即已被唤醒但尚未恢复执行的线程数。唤醒的原因是确保我们的信号量具有属性 3,如第 4.3 节所述
和
属性 3:如果线程执行信号时有线程在信号量上等待,则必须唤醒等待中的线程之一。
好的,我想我明白该属性的含义了。其中一个等待线程应该获得互斥锁,而不是另一个(例如信号线程)。如果我错了,请纠正我。我不明白的是这种机制是如何保证这个属性的。我会说财产没有保证。非等待进程仍然有可能获得互斥锁。我错过了什么?
typedef struct {
int value, wakeups;
Mutex *mutex;
Cond *cond;
} Semaphore;
// SEMAPHORE
Semaphore *make_semaphore (int value)
{
Semaphore *semaphore = check_malloc (sizeof(Semaphore));
semaphore->value = value;
semaphore->wakeups = 0;
semaphore->mutex = make_mutex ();
semaphore->cond = make_cond ();
return semaphore;
}
void sem_wait (Semaphore *semaphore)
{
mutex_lock (semaphore->mutex);
semaphore->value--;
if (semaphore->value < 0) {
do {
cond_wait (semaphore->cond, semaphore->mutex);
} while (semaphore->wakeups < 1);
semaphore->wakeups--;
}
mutex_unlock (semaphore->mutex);
}
void sem_signal (Semaphore *semaphore)
{
mutex_lock (semaphore->mutex);
semaphore->value++;
if (semaphore->value <= 0) {
semaphore->wakeups++;
cond_signal (semaphore->cond);
}
mutex_unlock (semaphore->mutex);
}
【问题讨论】:
标签: c multithreading mutex semaphore conditional-statements