方法
pthread_cond_wait(condition,mutex)
pthread_cond_signal(condition)
pthread_cond_broadcast(condition)
用法
- pthread_cond_wait()会阻塞调用该方法的线程,直到等待的条件变量接收到了信号。应该在对某个互斥量上锁后调用该方法,它会在阻塞线程时自动释放互斥量。等待的条件变量接收到信号后,阻塞的线程会被唤醒,之前被释放的互斥量会再次被上锁。那么当该线程完成相关工作后,它需要正确地释放互斥量。
- 建议:使用while循环而不是if来判断等待的条件是否满足,这会避免一些潜在的问题,例如:
-
- 如果多个线程在等待同一个条件变量的唤醒信号,它们会被依次唤醒并获得对应的互斥锁;此时有可能某个线程对一些共享数据做了修改,使得实际上等待的条件不再被满足,而此时其他等待的线程已经跳过了相关的判断。
- 线程因为一些程序问题被错误地唤醒了
- Pthreads允许在不违反标准的前提下“伪唤醒”被阻塞的线程。
所以有必要在等待的条件变量接手到信号后,再次判断是否满足继续执行的条件;由此推荐使用while循环判断,而不是只用if判断一次。
- pthread_cond_signal()用于给某个条件变量发送信号,从而唤醒等待该条件变量的一个线程。需要在调用该方法前对配合使用的互斥量上锁,然后在该方法完成后对释放互斥量。
- pthread_cond_broadcast()用于给某个条件变量发送信号,从而唤醒等待该条件变量的所有线程。
- 在pthread_cond_wait()之前调用pthread_cond_signal()在逻辑上是有问题的
- 使用这些方法时对配套使用的互斥量做正确的加锁和释放是必要的
-
- 在调用pthread_cond_wait()之前没有对互斥量上锁可能导致等待条件变量的线程没有被阻塞
- 在调用pthread_cond_signal()之后没有释放互斥量可能导致另一个调用了pthread_cond_wait()的线程无法被唤醒