条件変数を待機しているスレッドはミューテックスをロックしたままにしておく必要があり、他のスレッドは常にミューテックスをロックした状態でシグナルを送る必要があります。このようにして、シグナルを送信したときに、他のスレッドが条件を待っていることがわかります。そうしないと、待機中のスレッドがシグナル状態が表示されず、無期限にブロックされて待機する可能性があります。
条件変数は通常、次のように使用されます。
#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
おそらく永遠に待たされます。これが、ミューテックスをロックしてシグナルを送る理由です。