调用 pthread_cond_signal 的线程会发生什么情况?

What happens to a thread calling pthread_cond_signal?

当线程调用 pthread_cond_signal 时,等待条件的线程之一将恢复执行。但是调用线程会发生什么?它是否等待被调用线程释放互斥量然后恢复?

例如等待线程:

pthread_mutex_lock(&mut);
// ...
pthread_cond_wait(&cond, &mut);
// ...
pthread_mutex_unlock(&mut);

信号线程:

pthread_mutex_lock(&mut);
// ...
pthread_cond_signal(&cond);
// ... has work to finish
pthread_mutex_unlock(&mut);

在这种情况下,如果等待线程已经接管互斥锁,信号线程如何继续工作?

立即调用pthread_cond_signalreturn的线程。它不会等待被唤醒的线程(如果有的话)做任何事情。

如果您在调用 pthread_cond_signal 的同时持有被阻塞线程使用 pthread_cond_wait 的互斥锁,那么被阻塞的线程可能会从条件变量等待中唤醒,然后立即阻塞等待互斥锁将被获取,因为信号线程仍然持有锁。

为了获得最佳性能,您应该在调用 pthread_cond_signal 之前解锁互斥锁。

此外,pthread_cond_wait 可能 return 即使没有线程向条件变量发出信号。这称为 "spurious wake"。您通常需要在循环中使用 pthread_cond_wait

pthread_mutex_lock(&mut);
while(!ready){
    pthread_cond_wait(&cond,&mut);
}
// do stuff
pthread_mutex_unlock(&mut);

发信号线程然后在发信号之前设置标志:

pthread_mutex_lock(&mut);
ready=1
pthread_mutex_unlock(&mut);
pthread_cond_signal(&cond);