操作系统进程同步算法——生产者-消费者问题
问题描述:
一组生产者进程和一组消费者进程共享一个大小为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的互斥信号量 在访问临界区之间进行P操作 在访问完临界区之后进行V操作 信号量机制实现进程同步的步骤: 设置初值为0的同步信号量 在前操作之后 ...
- 生产者消费者算法的简单实现
系列文章目录 文章目录 系列文章目录 ***实验内容*** 背景知识 **1.了解经典同步问题"生产者和消费者** 思路 二.源代码 运行结果 结论 实验内容 1.问题描述:一组生产者向一组 ...
- 【操作系统/OS笔记13】信号量、PV操作、管程、条件变量、生产者消费者问题
本次笔记内容: 10.1 背景 10.2 信号量 10.3 信号量的使用 10.4 信号量的实现 10.5 管程 文章目录 信号量的提出背景 信号量(semaphore) 信号量数据类型 信号量类似铁 ...
- java信号量生产者_java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- 【操作系统-进程】PV操作——生产者消费者问题
文章目录 生产者消费者问题的万能方法步骤 Step 1. 有几类进程 Step 2. 用中文描述动作 Step 3. 添加 PV 操作,用中文描述里面的操作 Step 4. 检查是否出现死锁 Step ...
- 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果
一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...
- 操作系统 - - 生产者—消费者问题(PV操作)代码显示
生产者 - 消费者问题 假设在生产者和消费者之间的公用缓冲池具有n个缓冲区,可利用互斥信号量mutex实现诸进程的互斥使用:利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量. 又 ...
- java实现的PV操作经典例子:读者写者、贪睡的理发师、生产者消费者。
其中读者写者和贪睡的理发师使用的Semaphore类:生产者消费者使用的是管程. 读者写者 class Semaphore {int value;public Semaphore(int v){thi ...
- 几个java实现的PV操作经典例子:读者写者、贪睡的理发师、生产者消费者
其中读者写者和贪睡的理发师使用的Semaphore类:生产者消费者使用的是管程. 读者写者: class Semaphore {int value;public Semaphore(int v){th ...
最新文章
- liunx查看python的site-packages路径
- 二十一、文本情感分类二
- 《Flask Web开发——基于Python的Web应用开发实践》代码使用方法
- c语言如何监控网卡信息,查看网卡信息及状态和网卡日志信息
- 带有Oracle Digital Assistant和Fn Project的会话式UI。 第二部分
- oracle.cmd
- HashMap面试指南
- 图标截取——背景偏移量技术
- C语言学习笔记---动态内存分配
- 计算机保研英语,计算机专业保研面试英语自我介绍
- android编译framework架包运行报错 (转)
- linux路由表的查看和含义
- 第二次作业-Steam软件分析
- 虚拟环境中更新pip
- 如何更改项目的发布名称
- Android性能专项FPS测试实践
- 数据库管理系统的未来是什么?
- java ftps 证书_FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择
- linkis标准版安装教程
- 谈谈商业合作中的“男人来自火星,女人来自金星”