1. 生产者消费者模型
当有一个或多个生产者线程和一个或多个消费者线程时,由于生产和消费的区域是共享资源,所以我们需要线程同步机制来有序访问资源。
1.1条件变量
(1)什么是条件变量?
条件变量是一个等待队列,当条件(condition)不满足时,线程把自己加入队列,等待另一个线程改变条件,就可以唤醒一个或多个等待线程。
(2)条件变量关键函数
条件变量的相关操作有两个,wait()和signal()。
1)wait函数
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
调用wait函数时,mutex必须是一个 已经上锁的互斥量。
多线程程序在检查条件变量时(即wait()返回时),使用while循环总是对的。(原则1)
Wait()做的几件事:
1.调用wait()的线程阻塞并等待条件变量cond(参1)满足
2.释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex);
3.当被其他线程唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);
也就是说,wait返回时,当前线程持有上锁的互斥锁mutex。
2)signal函数(发送信号函数)
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
激活至少一个等待在条件变量上的线程。若多个线程被激活,则被激活的线程逐一解除阻塞并执行,但同一时间只能有一个线程被激活。
发送信号时(即调用pthread_cond_signal),当前线程必须是持有锁状态。(原则2)
【参考资料】1.操作系统导论 2.黑马程序员编程笔记