Skip to main content

24 Conditional Variable

条件变量

定义

每个条件变量和一个队列关联。这个队列中包含所有在等待这个条件变量的线程。如果条件未被满足,则这些所有线程睡眠;否则,改变条件的线程会唤醒一个(或某些)线程。

pthread_cond_t c;
pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m);
pthread_cond_signal(pthread_cond_t *c);

线程在持有锁时调用wait。如果条件不满足,线程会释放锁,然后进入睡眠;条件满足时,线程会被唤醒,并尝试重新获取锁再返回。

注意必须上锁/先使用wait函数再使用signal函数。

此外,也可以唤醒全部等待的线程。

pthread_cond_broadcast();

信号量

实现

void init(sem_t *s, int value) {
s->value = value;
cond_init(&s->cond);
mutex_init(&s->mutex);
}

void wait(sem_t *s) {
mutex_lock(lock);
while (value <= 0) {
cond_wait(cond, lock);
}
value--;
mutex_unlock(lock);
}

void post(sem_t *s) {
mutex_lock(lock);
value++;
cond_signal(cond);
mutex_unlock(lock);
}