题目:

进程A1、A2、…n1.通过m个缓冲区向进程B1、B…n.不断地发送
消息。发送和接收工作遵循如下规则:
(1) 每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小等于
消息长度;
(2)对每一个消息,B1,B2,…,. Bn都必须接收一次,读入各自的数据区内。
m个缓冲区都满时,发送进程等待;没有可读的消息时,接收进程等待。


semaphore mutex=1; //用于所有进程互斥访问缓存区buffer,以及in,out变量
semaphore empty = m, full = 0;int in = 0, out = 0;
buffer[m];semaphore mutex2 = 0;  //用于互斥访问rcount,flag;
int rcount = 0;    //用于记录当前in所指的消息有多少个B类进程已接收
int flag[n2] = {0,0,0,0,....,0}; //flag[i]==1表示Bi已经取过buffer[in]中的消息了 void A(int i) //进程Ai 下标从0开始
{while(true){准备要发送的消息;wait(empty);wait(mutex);buffer[in] = 要发送的消息;in = (in+1)%m;signal(mutex);signal(full); }
}
void B(int i) //Bi下标从0开始
{while(true){wait(mutex2); if(flag[i] == 0){wait(full);wait(mutex);将buffer[out]所存的消息取出;flag[i] = 1;rcount++;if(rcount == n2){//Bi是B类进程最后一个读该消息的进程 out = (out+1)%m;signal(empty); //将flag、rcount重置 for(int j = 0; j < n2; j++)  flag[j] = 0;rcount = 0;}else{//不是应signal(full)一次补偿被自己消耗的full signal(full);}signal(mutex);}signal(mutex2); }
}
int main()
{cobegin:for(int i = 0; i < n1; i++) A(i);for(int j = 0; j < n2; j++) B(j);coend;return 0;
}

生产者和消费者问题变形相关推荐

  1. 生产者与消费者问题------legend050709

    生产者与消费者问题:   (一)基础: (1.0)生产者消费者的背景 1>为了平衡生产者和消费者的处理能力,起到一个数据缓存的作用,同时也达到了一个解耦的作用 在多线程开发中,如果生产者生产数据 ...

  2. RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器

    本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...

  3. linux进程间通信:system V 信号量 生产者和消费者模型编程案例

    生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...

  4. Python中的生产者与消费者模式(转载)

    利用多线程和队列可以实现生产者消费者模式.该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度. 1.什么是生产者和消费者? 在线程世界里,生产者就是生产数据(或者说发布任务)的线程 ...

  5. 12.多线程的实现方式、线程安全问题的产生与解决以及生产者与消费者问题

    一.实现多线程 1.1 了解多线程 多线程是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,从而提升性能. 1.2 并发与并行 并行是指同 ...

  6. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

  7. python生产和消费模型_python queue和生产者和消费者模型

    queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. classqueue.Queue(maxsize=0) #先入先出classqueue.LifoQueue(maxsi ...

  8. 基于java多线程来实现生产者和消费者的实例

    声明:本实例是在网上看到,做了很小的修改.所以感谢之前的作者.只是一时忘了哪儿看到,没法加入链接,向原作者道歉,以示尊重.抱歉-^)... 同步栈: 1 class SycnStack { 2 pri ...

  9. PV操作——生产者和消费者

    首先,先来看几个概念: 同步:协作的过程,比如,多人开发合作. 相互排斥:争抢资源的过程.比如苦逼的大学选课: 临界区:进程中对临界资源实施操作的那段程序: 临界资源:一次仅仅能一个进程使用的资源,比 ...

最新文章

  1. px像素如何转为dip设备独立像素设备独立像
  2. xampp mysql登录失败_XAMPP修改mysql的root密码phpmyadmin无法登陆
  3. spring-security学习笔记--配置文件
  4. 7-57 愿天下有情人都是失散多年的兄妹 (25 分)(深搜)
  5. tableau两个不同的图合并_举个栗子!Tableau技巧(59):学做两个集合的维恩图(文氏图)Venn diagram...
  6. (转!)Netdata---Linux系统性能实时监控平台部署
  7. 【英语学习】【English L06】U04 Adventure L3 The city playground and some famous museums
  8. linux下用脚本语言开发自动重启程序
  9. Linux 下 I/O 多路复用技术 epoll
  10. Linux入门相关基础知识
  11. 诗词温习集:跟梁瀚文一起重温诗词(唐诗)之《春望》
  12. 2022最新版独立后台国庆头像生成小程序源码+教程
  13. 企业经营数据分析-读后感
  14. 女模应聘遭遇潜规则 将计就计对面试官实施抢劫
  15. csdn博客日志test1
  16. 罗永浩回应被叫行业冥灯:完全不能同意;联想一员工侵占公司工时费近1000万;爱彼迎CEO:办公室时代已过去 | EA周报...
  17. IP-guard安全U盘操作手册
  18. 股票入门基础知识16:财务比率的局限性
  19. JAVA美食预定推荐系统
  20. 镜像神经元过于发达的人,镜像神经元优秀的人

热门文章

  1. python需要下载哪些软件-80%的人都不知道,全球Python库下载前10名
  2. 免费python自学攻略-自学python二三事
  3. python 菜鸟-Python3 集合
  4. python必备基础代码-【Python基础系列】常见的数据预处理方法(附代码)
  5. Keil用C语言定义函数,STC单片机Keil中C语言函数定位的方法
  6. 在虚拟DOM和Diff算法中为什么不建议使用index作为key值?
  7. vue 连接地址下载 PDF
  8. jQuery 学习-样式篇(九):jQuery 存储和删除元素私有数据的方法
  9. html5 valid,html5中valid、invalid、required的定义
  10. android 轻量级工具,轻量级文件粉碎工具(File Shredder Tool) v1.0 免费版