初始化条件变量
动态方法 pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr)
静态方法 pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
阻塞条件变量
int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex);
调用之前必须锁定互斥变量,之后解锁互斥变量。顺序如下:
pthread_mutex_lock(XX);
while (condition_is_false) pthread_cond_wait(CC,XX);
。。。。。。执行某些操作;
pthread_mutex_unlock(XX);
pthread_cond_wait函数的返回并不意味着条件的值一定发生了变化,必须重新检查条件的值。即挂起的线程可能被误唤醒,为避免误唤醒,使用了while来执行pthread_cond_wait。
pthread_cond_wait执行过程如下:
- pthread_mutex_unlock(XX); 先释放XX锁;
- 进程挂起,等待条件变量唤醒;
- 条件变量唤醒后,申请互斥锁XX;
- 执行指定操作,释放互斥锁XX。
阻塞直到指定时间超时的函数,pthread_cond_timedwait()。
唤醒条件变量
pthread_mutex_lock(XX);
执行某些操作
pthread_cond_signal(pthread_cond_t *cv);
pthread_mutex_unlock(XX);
线程条件变量好处就是线程不需要循环检测条件,解决了忙等的问题,为了避免多个线程同时pthread_cond_wait,必须跟互斥量配合使用。