条件变量 生产者/消费者模型

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.黑马程序员编程笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。