当条件满足的时候,线程通常解锁并等待该条件发生变化,一旦另一个线程修改了环境变量,就会通知相应的环境变量唤醒一个或者多个被这个条件变量阻塞的线程。这些被唤醒的线程将重新上锁,并测试条件是否满足。一般来说条件变量被用于线程间的同步;当条件不满足的时候,允许其中的一个执行流挂起和等待。
简而言之,条件变量本身不是锁,但它也可以造成线程阻塞,通常与互斥锁配合使用,给多线程提供一个会合的场所。
条件变量的优点:
- 相较于mutex而言,条件变量可以减少竞争。如果仅仅是mutex,那么,不管共享资源里有没数据,生产者及所有消费都全一窝蜂的去抢锁,会造成资源的浪费。
- 如直接使用mutex,除了生产者、消费者之间要竞争互斥量以外,消费者之间也需要竞争互斥量,但如果汇聚(链表)中没有数据,消费者之间竞争互斥锁是无意义的。有了条件变量机制以后,只有生产者完成生产,才会引起消费者之间的竞争。提高了程序效率。
主要应用函数:
- pthread_cond_init函数
- pthread_cond_destroy函数
- pthread_cond_wait函数
- pthread_cond_timedwait函数
- pthread_cond_signal函数
- pthread_cond_broadcast函数
以上6 个函数的返回值都是:成功返回0, 失败直接返回错误号。
pthread_cond_t类型:用于定义条件变量,比如:pthread_cond_t cond;
##pthread_cond_init函数
函数原型:
- int pthread_cond_init(pthread_cond_t restrict cond, const pthread_condattr_t restrict attr);
函数作用:初始化一个条件变量
参数说明:
- cond:条件变量,调用时应传&cond给该函数
- attr:条件变量属性,通常传NULL,表示使用默认属性