线程同步:消费者模型(非常重要的模型)

news/2024/9/23 22:23:48/

一.线程同步的概念

  • 线程同步:是指在互斥的基础上,通过其它机制实现访问者对 资源的有序访问。
  • 条件变量:线程库提供的专门针对线程同步的机制
  • 线程同步比较典型的应用场合就是 生产者与消费者

二、生产者与消费者模型原理

  1. 在这个模型中,包括生产者线程与消费者线程。通过线程来模拟多个线程同步的过程
  2. 在这个模型中,需要以下组件
  • 仓库 : 用于存储产品,一般作为共享资源
  • 生产者线程 : 用于生产产品
  • 消费者线程 : 用于消费产品
  1. 原理
  • 当仓库没有产品时,则消费者线程需要等待,直到有产品时才能消费
  • 当仓库已经装满产品时,则生产者线程需要等待,直到消费者线程消费产品之后

在这里插入图片描述

三、生产者与消费者模型同步

using namespace std;
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<ctime>
#include<deque>
#include<cstdlib>
#include<pthread.h>
#include <unistd.h>
int production = 0;
//静态互斥锁
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//线程生产函数 
void * start_routinue(void* arg){int nsems = atoi((char*)arg);for(int i = 0;i < nsems;i++){pthread_mutex_lock(&mutex);production++;cout << pthread_self() << "生产了" <<  production << endl;sleep(1);  pthread_mutex_unlock(&mutex);}pthread_exit(NULL);
}
//主函数 
int main(int argc,char* argv[]){if(argc < 2){cout << "error" << endl;exit(EXIT_FAILURE);}cout << argc  << endl;int total_production = 0;int total_resumption = 0;vector<pthread_t> arr;for(int i = 1;i < argc;i++){arr.push_back(i);}for(int i = 0;i < arr.size();i++){total_production += atoi(argv[i + 1]);int ret = pthread_create(&(arr.at(i)),NULL,start_routinue,(void*)argv[i + 1]);if(ret != 0){cout << "create failed" << endl;exit(EXIT_FAILURE);}}//线程消费while(1){pthread_mutex_lock(&mutex);while(production > 0){total_resumption++;production--;cout << pthread_self() <<  "消费了" << endl;sleep(1);}if(total_resumption == total_production){break;}pthread_mutex_unlock(&mutex);}
}

请添加图片描述


http://www.ppmy.cn/news/1529517.html

相关文章

10月23-27日六西格玛绿带公开课即将在雄安新区开课

在金秋送爽、硕果累累的季节里&#xff0c;天行健管理咨询公司宣布了一项重要决定——定于10月23日至27日&#xff0c;在充满未来气息的河北雄安新区&#xff0c;举办一场旨在提升企业质量管理水平、培养精英人才的六西格玛绿带公开课。此次课程的举办&#xff0c;不仅是对当前…

Android MediaPlayer + GLSurfaceView 播放视频

Android使用OpenGL 播放视频 概述TextureView的优缺点OpenGL的优缺点 实现复杂图形效果的场景参考 概述 在Android开发中&#xff0c;使用OpenGL ES来渲染视频是一种常见的需求&#xff0c;尤其是在需要实现自定义的视频播放界面或者视频特效时。结合MediaPlayer&#xff0c;我…

【RTT-Studio】详细使用教程十六:DAC7311外部DAC使用

文章目录 一、简介二、驱动程序三、DAC设置注册四、完整代码五、测试验证 一、简介 8 位 DAC5311、10 位 DAC6311 和 12 位 DAC7311 (DACx311) 是低功耗、单通道、电压输出数模转换器 (DAC)。DACx311 在正常工作状态下具有低功耗&#xff08;5V 时为 0.55mW&#xff0c;断电模式…

哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加

​​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 在使用ArcGIS Pro的过程中&#xff0c;很多朋友发现&#xff0c;Pro有个成对叠加工具集。很多…

是德科技Keysight N4433D ECal模块 26.5GHz 4端口3.5毫米

是德科技Keysight N4433D ECal模块 26.5GHz 4端口3.5毫米 Keysight N4433D 射频电子校准 (ECal) 模块使是德科技矢量网络分析仪的校准变得快速、简单和准确。N4433D 是一款精密 4 端口电子校准件模块&#xff0c;支持选择 3.5 毫米连接器&#xff0c;最高可混频至 26.5 GHz。选…

数据结构:时间复杂度与空间复杂度

目录 算法效率时间复杂度大O渐进表示法时间复杂度计算案例 空间复杂度空间复杂度案例 复杂度算法题 算法效率 算法在编写成可执行程序后&#xff0c;运⾏时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好坏&#xff0c;⼀般是从时间和空间两个维度来衡量的&#xf…

Spring 全局与局部异常处理解析 + 实战案例

Spring 全局与局部异常处理解析 实战案例 在 Java 开发中&#xff0c;异常处理是非常重要的一环。它不仅能够提升代码的健壮性&#xff0c;还能为用户提供有意义的错误提示。在 Spring Framework 中&#xff0c;我们可以通过全局和局部异常处理来优雅地管理异常。本文将结合 …

大数据毕业设计选题推荐-高校考试分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…