条件变量(cond)
互斥锁有明显的缺点只有lock和unlock状态。设计多任务时容易死锁,使用也不灵活。而条件变量引入了信号弥补了互斥锁的不足。
与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。
条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:
1、等待条件:一个线程等待"条件变量的条件成立"而挂起;
2、触发条件:另一个线程使"条件成立"(给出条件成立信号)。
使用时,条件变量被用来阻塞线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化一旦其他线程改变了变量,他将通知条件变量唤醒一个或者多个线程被这个条件变量阻塞的线程。被再次获得互斥锁,然后重新判断条件是否满足。
使用条件变量之前要先进行初始化。初始化方式有两种。
1、 静态初始化:可以在单个语句中生成和初始化一个条件变量如:
pthread_cond_tmy_condition=PTHREAD_COND_INITIALIZER;(用于进程间线程的通信)。
2、 动态初始化:动态申请内存后,利用函数pthread_cond_init动态初始化。和其他动态初始化一样,在释放内存之前需要先调用pthread_cond_destroy()。
条件变量类型为 pthread_cond_t。
相关操作如下:
int pthread_cond_init(pthread_cond_t*cond, pthread_condattr_t*cond_attr);//初始化
int pthread_cond_wait(pthread_cond_t*cond, pthread_mutex_t*mutex);//等待条件成立
int pthread_cond_timewait (pthread_cond_t*cond, pthread_mutex*mutex,consttimespec* abstime); //指定等待超时时间的等待函数,
int pthread_cond_destroy(pthread_cond_t*cond); //清除条件变量:destroy
int pthread_cond_signal(pthread_cond_t*cond); //激活条件变量
int pthread_cond_broadcast(pthread_cond_t*cond);//解除所有线程的阻塞
1 初始化条件变量
使用pthread_cond_init()可以将cv所指示的条件变量初始化为其缺省值,或者指定已经使用pthread_condattr_init()设置的条件变量属性。
函数原型: