等待条件变量的线程应保持互斥锁锁定,而另一个线程应始终用锁定互斥锁发出信号。这样,当您发送信号时,您就知道其他线程正在等待该条件。否则,等待线程可能不会看到发出信号的条件,并且会无限期地阻塞等待它。
条件变量通常这样使用:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int go = 0;
void *threadproc(void *data) {
printf("Sending go signal\n");
pthread_mutex_lock(&lock);
go = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
}
int main(int argc, char *argv[]) {
pthread_t thread;
pthread_mutex_lock(&lock);
printf("Waiting for signal to go\n");
pthread_create(&thread, NULL, &threadproc, NULL);
while(!go) {
pthread_cond_wait(&cond, &lock);
}
printf("We're allowed to go now!\n");
pthread_mutex_unlock(&lock);
pthread_join(thread, NULL);
return 0;
}
这是有效的:
void *threadproc(void *data) {
printf("Sending go signal\n");
go = 1;
pthread_cond_signal(&cond);
}
但是,请考虑发生在main
while(!go) {
/* Suppose a long delay happens here, during which the signal is sent */
pthread_cond_wait(&cond, &lock);
}
如果该评论描述的延迟发生,pthread_cond_wait
将等待 - 可能永远。这就是为什么您要在互斥锁锁定的情况下发出信号。