信号量,互斥量,条件量是线程间保证线程同步的三种方式,其中信号量和互斥量是通过堵塞的方式来实现资源的竞争,试想一下,如果有多个消费者线程同时在等待一个生产者生产产品时,如果只用到互斥量,那么每个消费者线程在访问产品这个临界资源的时候都需要对互斥量metex进行先上锁,读取并且判断有无产品,再解锁地操作。但这是在浪费时间和资源,而且这种繁忙查询的效率非常低。同样,在每次检查之间让线程短暂地进入睡眠,比如睡眠1s,但是因此线程代码就无法最快作出响应。
这样也就有了条件量的使用,简单来说,使用条件量可以使原本堵塞的线程进入休眠状态,直到条件满足,休眠的线程被signal唤醒,执行操作,这样就不会产生竞争
条件量通常是配合互斥量一起用,其中条件量起到了唤醒线程的作用,而互斥量起到了保护条件的作用,线程在改变条件状态时首先先锁住互斥量,改变条件后,发送信号,再释放互斥量。(如果不使用互斥量,当有多个线程同时调用wait时,“等待线程“队列被多个同时访问,就会导致数据错乱)
相关函数
1. int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
作用:条件量的初始化
返回值:成功返回,失败返回-1;
形参