问题描述:

一组生产者进程和一组消费者进程共享一个大小为n的缓冲区,只有没其他进程使用缓冲区时,其中的一个进程才能访问缓冲区。对于消费者来说,只有缓冲区不空时才能访问缓冲区并读取信息;对于生产者来说,只有缓冲区不满是才能访问缓冲区并写入信息。

#include <iostream>
#include <stdlib.h>
using namespace std;const int n = 10;//设置缓冲区数量
//信号量数据结构
typedef struct semaphore {int mutex;//互斥信号int empty;//空缓冲区数量int full; //满缓冲区数量
}*semaphoreptr;
//缓冲区数组
int a[n];
//定义进程类
class Progress {char name;
public:Progress() {}~Progress(){}virtual void wait(semaphoreptr s,int a[]) = 0;//申请访问缓冲区virtual void signal(semaphoreptr s) = 0;//使用完毕,释放缓冲区
};
class Producer:public Progress {
public:void wait(semaphoreptr s,int a[]);void signal(semaphoreptr s);
};
void Producer::wait(semaphoreptr s,int a[]) {if (s->mutex == 1) {//此时表示消费者正在读取缓冲区信息cout << "有进程正在占用缓冲区,无法进行写入..." << endl;return;}if (s->full == n + 1) {cout << "缓冲区以满,无法进行写入..." << endl;return;}s->mutex = 1;//锁住缓冲区a[s->full] = 6;//默认输入数字为6
}
void Producer::signal(semaphoreptr s) {if (s->mutex == 1) {s->mutex = 0;//打开缓冲区的互斥锁s->full++;s->empty--;cout << "数据输入成功,释放缓冲区使用权..." << endl;}
}
class Consumer :public Progress {
public:void wait(semaphoreptr s, int a[]);void signal(semaphoreptr s);
};
void Consumer::wait(semaphoreptr s, int a[]) {if (s->mutex == 1) {cout << "有进程占用缓冲区,无法进行读操作..." << endl;return;}if (s->empty == n) {cout << "缓冲区为空,无法进行读操作..." << endl;return;}s->mutex = 1;s->full--;
}
void Consumer::signal(semaphoreptr s) {if (s->mutex == 1) {s->mutex = 0;s->empty++;cout << "读取成功,读出的数为" << a[s->full] << " 释放缓冲区使用权..."<<endl;}
}
int main()
{semaphoreptr s = (semaphore *)malloc(sizeof(semaphore));s->mutex = 0;s->empty = n;s->full = 0;Producer p;Consumer c;p.wait(s, a);p.signal(s);c.wait(s, a);c.signal(s);p.wait(s, a);c.wait(s, a);p.signal(s);c.wait(s, a);c.signal(s);return 0;
}

参考书籍: 王道 《2018年操作系统考研复习指导》

操作系统进程同步算法——生产者-消费者问题相关推荐

  1. 三、操作系统——生产者-消费者问题(两个同步一个互斥)

    一.问题描述 信号量机制实现进程互斥的步骤: 设置初值为1的互斥信号量 在访问临界区之间进行P操作 在访问完临界区之后进行V操作 信号量机制实现进程同步的步骤: 设置初值为0的同步信号量 在前操作之后 ...

  2. 生产者消费者算法的简单实现

    系列文章目录 文章目录 系列文章目录 ***实验内容*** 背景知识 **1.了解经典同步问题"生产者和消费者** 思路 二.源代码 运行结果 结论 实验内容 1.问题描述:一组生产者向一组 ...

  3. 【操作系统/OS笔记13】信号量、PV操作、管程、条件变量、生产者消费者问题

    本次笔记内容: 10.1 背景 10.2 信号量 10.3 信号量的使用 10.4 信号量的实现 10.5 管程 文章目录 信号量的提出背景 信号量(semaphore) 信号量数据类型 信号量类似铁 ...

  4. java信号量生产者_java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  5. 【操作系统-进程】PV操作——生产者消费者问题

    文章目录 生产者消费者问题的万能方法步骤 Step 1. 有几类进程 Step 2. 用中文描述动作 Step 3. 添加 PV 操作,用中文描述里面的操作 Step 4. 检查是否出现死锁 Step ...

  6. 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果

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

  7. 操作系统 - - 生产者—消费者问题(PV操作)代码显示

    生产者 - 消费者问题 假设在生产者和消费者之间的公用缓冲池具有n个缓冲区,可利用互斥信号量mutex实现诸进程的互斥使用:利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量. 又 ...

  8. java实现的PV操作经典例子:读者写者、贪睡的理发师、生产者消费者。

    其中读者写者和贪睡的理发师使用的Semaphore类:生产者消费者使用的是管程. 读者写者 class Semaphore {int value;public Semaphore(int v){thi ...

  9. 几个java实现的PV操作经典例子:读者写者、贪睡的理发师、生产者消费者

    其中读者写者和贪睡的理发师使用的Semaphore类:生产者消费者使用的是管程. 读者写者: class Semaphore {int value;public Semaphore(int v){th ...

最新文章

  1. liunx查看python的site-packages路径
  2. 二十一、文本情感分类二
  3. 《Flask Web开发——基于Python的Web应用开发实践》代码使用方法
  4. c语言如何监控网卡信息,查看网卡信息及状态和网卡日志信息
  5. 带有Oracle Digital Assistant和Fn Project的会话式UI。 第二部分
  6. oracle.cmd
  7. HashMap面试指南
  8. 图标截取——背景偏移量技术
  9. C语言学习笔记---动态内存分配
  10. 计算机保研英语,计算机专业保研面试英语自我介绍
  11. android编译framework架包运行报错 (转)
  12. linux路由表的查看和含义
  13. 第二次作业-Steam软件分析
  14. 虚拟环境中更新pip
  15. 如何更改项目的发布名称
  16. Android性能专项FPS测试实践
  17. 数据库管理系统的未来是什么?
  18. java ftps 证书_FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择
  19. linkis标准版安装教程
  20. 谈谈商业合作中的“男人来自火星,女人来自金星”

热门文章

  1. 开发版生态农庄投资理财源码/袋鼠投资理财程序源码
  2. springboot搭建访客管理系统
  3. 现代图论笔记(三)图的距离与连通性
  4. word在写论文的一些技巧
  5. table实现上移下移的功能
  6. c语言函数矩阵转置代码,C语言实现矩阵转置
  7. Unity手游实战:ECS设计思想和Entitas插件
  8. DCGAN TUTORIAL
  9. wift密码 java
  10. Python数据清洗:数据框列名大小写转换