三个进程P1,P2,P3互斥使用包含N(N > 0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一个单元格;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从缓冲区中拿到一个偶数,并用counteven()统计偶数的个数。用信号量机制实现三个进程的互斥与同步。

首先看一个不行但很接近的写法:

semaphore mutex = 1;// 用于互斥访问缓冲区
semaphore empty = N;
semaphore full = 0;P1:
while(1)
{P(empty);produce();P(mutex);put();V(mutex);V(full);
}P2:
while(1)
{P(full);P(mutex);getodd();V(mutex);countodd();V(empty);
}P3:
while(1)
{P(full);P(mutex);geteven();V(mutex);counteven();V(empty);
}

至于何时count,位置有一定的灵活性,但是只有get才读取缓冲区,put才写缓冲区,因此尽量让P(mutex)和V(mutex)夹紧一些。

这中写法的最大问题是:V(full)时不能精确叫醒等待进程,而是全叫醒,像是广播一样!

因此,这里分奇数偶数,恰恰可以用作精准控制的元素。也即:设置even,odd信号量!

semaphore mutex = 1;// 用于互斥访问缓冲区
semaphore empty = N;
semaphore even = 0,odd = 0;P1:
while(1)
{P(empty);x = produce();P(mutex);put();V(mutex);if(x % 2 == 0){V(even);}else{V(odd);}
}P2:
while(1)
{P(odd);P(mutex);getodd();V(mutex);V(empty);countodd(); //写在后面较好:快速释放空间
}P3:
while(1)
{P(even);P(mutex);geteven();V(mutex);V(empty);counteven();
}

所以,对比中才会更加明白为什么这样设计.

以上。

生产者-消费者习题的运用相关推荐

  1. openmp并行编程_OpenMP实现生产者消费者问题

    最近在学习OpenMP编程.记录下学习过程中的学习资料和历程.同时简单实现了<并行程序设计导论>中5.8节的生产者消费者问题(进程线程经典问题). OpenMP编程指南 参考资料: < ...

  2. RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现

    生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...

  3. 【C++】多线程(链式、循环队列)实现生产者消费者模式

    生产者消费者模式:         生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同 ...

  4. 面试官让我手写一个生产者消费者模式?

    不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...

  5. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现

    生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...

  6. 基于队列的生产消费设计java_生产者-消费者设计模式

    一.生产者消费者设计模式 1.中间队列 一段内存空间,且可存取: 2.两种角色 (1)生产者:生产数据: (2)消费者:消费数据. 3.三种关系 (1)生产者与生产者的互斥关系: (2)消费者与消费者 ...

  7. 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来

    题目要求: 用三个线程实现生产者消费者模型,其中一个线程作为生产者,二个线程作为消费者,生产者随机生产一个时间戳或者字符串,消费者消费这个时间戳,并不能重复消费,并将其打印出来.(这是一道百度面试的算 ...

  8. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

  9. java线程模拟生产者消费者问题

    所谓的生产者消费者问题,就是存在生产者和消费者两个线程,当仓库还没满的时候,生产者可以生产,当仓库没空的时候,消费者可以取走商品. 我们用实例说话: 下面,我们创建几个类: 1.消费者--主要负责消费 ...

最新文章

  1. R语言可视化堆叠(stack)的条形图并通过另外一个分类变量分离(dodge)条形图(stacking by one variable and dodging by another)实战
  2. auto_ptr动态分配对象
  3. 文巾解题 283. 移动零
  4. wxWidgets 富文本编辑器示例
  5. xshell可以连接上linux,但是xftp却连不上问题
  6. 旧 WCF 项目迁移到 asp.net core + gRPC 的尝试
  7. React开发(255):react项目理解 ant design 注意报错提示
  8. 让我放弃FastDFS拥抱MinIO的8个瞬间
  9. WEB2.0概念诠释
  10. 线性代数:切线空间和法向量变换
  11. 致远oa系统报价_致远的OA办公系统成本多少一套?
  12. linux gpt转mbr命令,linux GPT转mbr
  13. 北京地铁2015年规划(清晰、大图、可下载)
  14. HTTPS证书基本概述
  15. 华为鸿蒙麒麟巴龙鲲鹏,华为四大芯片 麒麟、巴龙、昇腾和鲲鹏“四大天王”...
  16. 【MySQL】物化视图
  17. 设计模式学习笔记(C++实现)(九)--组合模式
  18. python星号和双星号的区别
  19. 使用IE浏览器下载文件,文件名中文名称乱码
  20. 适合闷骚程序员的输入法皮肤

热门文章

  1. 卡尔曼滤波器的一种形象表达
  2. java 图片转成base64编码_java语言中如何将一个图片转换为base64编码的数据呢?
  3. 安卓中为什么onkeydown没有相应_为什么今年在园区注册个人独资企业能将企业总税率降低至3%?...
  4. html框架集frame是啥意思,HTML框架集frameset和内嵌框架iframe
  5. mysql repalication_MYSQL数据库知识点总结
  6. java日期转换_java日期格式转换
  7. php 编辑器格式输出_高效PHP开发人员的十大PHP开发工具
  8. pythonide的作用_你知道Python神器IDE是什么吗?
  9. mysql死锁 简单例子_写一个Mysql死锁的例子
  10. java table 内容居中_JTable内容居中显示 | 学步园