调用 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_signal
return的线程。它不会等待被唤醒的线程(如果有的话)做任何事情。
如果您在调用 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);
当线程调用 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_signal
return的线程。它不会等待被唤醒的线程(如果有的话)做任何事情。
如果您在调用 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);