操作系统 记录型信号量实现生产者消费者问题(完整代码)

2023-05-16

问题描述 

用信号量模拟生产者-消费者问题的过程。生产者和消费者两个线程共享同一个缓冲区,生产者不断向缓冲区中添加产品,消费者从缓冲区中消费产品。要保证缓冲区满了之后生产者不能再继续添加产品,需要等消费者至少消费一个产品之后生产者才能继续生产产品;缓冲区空了之后消费者不能再消费产品,需要等生产者至少生产一个产品之后消费者才能继续消费产品。

向缓冲区中添加产品和从缓冲区消费产品需要互斥操作保持同步。

生产者需要等待缓冲区有空间才能生产产品;消费者也不能在缓冲区为空时消费产品。这两个过程需要信号量来通知进行。

设置三个信号量

Mutex信号量实现生产者和消费之间的间接相互制约关系,资源共享,在某一时刻只能有一个享用资源。

Full、Empty信号量实现生产者和消费者之间的直接相互制约关系,进程合作。Empty为生产者的约束,缓冲区满使生产者不能操作。Full为消费者的制约,缓冲区空使消费者不能操作。

 完整代码

#include <iostream>
#include <fstream>
#include <Windows.h>
#include <process.h>
using namespace std;

#define BUFFER_SIZE 16
char buffer[BUFFER_SIZE]; //缓冲区
int in = 0, out = 0;

HANDLE Full;
HANDLE Mutex;
HANDLE Empty;
//初始化显示缓冲区,把空的标记为 “*”
void InitBuffer()
{
	for (int i = 0;i < BUFFER_SIZE;i++)
	{
		buffer[i] = '*';
	}
}
//显示缓冲区
void showBuffer()
{
	cout << "缓冲区存储情况为(*为无产品):";
	for (int i = 0;i < BUFFER_SIZE;i++)
	{
		cout << buffer[i] << " ";
	}
	cout << endl;
}
//生产者
DWORD WINAPI Producer(LPVOID)  
{	
	do
	{
		WaitForSingleObject(Empty,INFINITE);
		WaitForSingleObject(Mutex, INFINITE);

		char nextp[] = { 'a','d','c' };//产品
         srand(time(0) + rand());
		int k = (rand() % 3); //随机生产其中一种产品
		buffer[in] = nextp[k];
		cout << "【1】生产者在缓冲区" << in << "加入产品" << buffer[in] << endl;
		showBuffer();   //加入产品之后显示整个缓冲区情况
		cout << endl;
		in = (in + 1) % BUFFER_SIZE;  //循环 
		Sleep(100);  

		ReleaseSemaphore(Full,1,NULL); 
		ReleaseMutex(Mutex);
	} while (true);
}
//消费者
DWORD WINAPI Consumer(LPVOID)
{
	do
	{
		WaitForSingleObject(Full, INFINITE);  
		WaitForSingleObject(Mutex, INFINITE);
		
		cout << "【2】消费者在缓冲区消费第" << out << "个产品" << buffer[out] << endl;
//已消费产品为空,标记为“*”
		buffer[out] = '*'; 
		//缓冲区情况
		showBuffer();
		cout << endl;
		out = (out + 1) % BUFFER_SIZE;
		Sleep(100); 

		ReleaseSemaphore(Empty,1,NULL);  
		ReleaseMutex(Mutex);
	} while (true);
}
int main()
{
	InitBuffer();
	Mutex = CreateMutex(NULL, FALSE, NULL);
	Full = CreateSemaphore(NULL,0,BUFFER_SIZE, (LPCWSTR)"full");
	Empty = CreateSemaphore(NULL, BUFFER_SIZE, BUFFER_SIZE,(LPCWSTR)"empty");
	
	HANDLE produceThread = CreateThread(NULL, 0, Producer, NULL, 0, NULL);
	HANDLE consumerThread = CreateThread(NULL, 0, Consumer, NULL, 0, NULL);

	Sleep(INFINITE);

	CloseHandle(Empty);//关闭句柄
	CloseHandle(Full);
	CloseHandle(Mutex);
	CloseHandle(produceThread);
	CloseHandle(produceThread);
}

运行结果

感谢指导!

(转载请注明)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统 记录型信号量实现生产者消费者问题(完整代码) 的相关文章

  • Android搭建无线调试环境

    ADB 安卓官网对此工具的介绍 Android 调试桥 adb 是一种功能多样的命令行工具 xff0c 可让您与设备进行通信 adb 命令可用于执行各种设备操作 xff08 例如安装和调试应用 xff09 xff0c 并提供对 Unix s
  • Golang:使用 FCM 实现推送通知

    firebase和设备令牌基本介绍 设备令牌是主要参赛者 xff0c 负责推送通知 这不是一个花哨的词 xff0c 它只是每个设备唯一的 id 当我们安装任何应用程序时 xff0c 我们设备的唯一令牌会存储在他们的服务器上 xff0c 他们
  • 适用于 Flutter 的 AWS Amplify

    关于Amplify Amplify 于 2017 年推出 xff0c 是面向移动和前端 Web 开发人员的端到端 AWS 解决方案 它是服务和工具的组合 xff0c 可以一起使用或单独使用 xff0c 以帮助移动和前端开发人员使用 AWS
  • Android Native 异常捕获库

    现状 发生native异常时 xff0c 安卓系统会将native异常信息输出到logcat中 xff0c 但是java层无法感知到native异常的发生 xff0c 进而无法获取这些异常信息并上报到业务的异常监控系统 业务部门可以快速实现
  • 从 ExoPlayer 源码分析视频无法播放问题

    What happened 最近负责的项目中碰到了在部分手机上无法播放视频的问题 xff0c 我们接入的是 ExoPlayer 三方库 xff0c 从 log 看出现的是 Decoder init failed xff0c 也是网上常见的
  • Android Xposed 框架

    一 Xposed框架简介 Xposed是Android平台上的一个常用的HOOK框架 xff0c 可以在不改变程序源代码的前提下 xff0c 影响程序的运行 一个支持Xposed的Android应用程序被称为一个Xposed模块 xff0c
  • 干了3年Android开发,2023年我离职了...

    今天在网上刷到一个帖子 xff0c 说Android岗 xff0c 在公司呆了三年 xff0c 由于疫情原因 xff0c 公司效益不是很好 xff0c 加上自己的技术一直停留在应用开发 xff0c 在公司可有可无 xff0c 被公司裁后找不
  • 新来的23岁Android开发上来秀了波操作,把几个老员工看傻了

    春招了 xff0c 公司来了个小伙子 xff0c 一看简历 xff0c 嘿 xff1f 22岁 xff0c 这不刚毕业的小毛孩子嘛 xff0c 结果没想到人家上来就把现有项目的性能优化了一遍 xff0c 给公司节省了一半的成本 xff0c
  • 程序员因薪资低拒绝offer,HR恼羞成怒,网友瞬间炸翻了..

    一名程序员员在求职过程中 xff0c 碰到一位薪资谈不拢就恼羞成怒的HR xff0c 并说出 估计你一辈子就是个程序员 这样的话 从这位开发和HR的聊天内容中 xff0c 我们可以看到二者的谈薪过程 首先 xff0c HR开出15k的薪资
  • Linux C系统编程——使用信号量实现生产者,消费者问题(两分钟搞明白)

    信号量和信号不是同一个东西 信号量 xff1a 指的是semaphore xff0c 相当于设置初始值为N的互斥量 xff0c N就表示同时访问的线程数 xff08 针对的是线程同步问题 xff09 信号 xff1a 指的是用来实现进程与进
  • Java线程状态中BLOCKED和WAITING有什么区别?

    刚才在看CSDN的问答时 xff0c 发现这个问题 原问题的作者是在观察jstack的输出时提出的疑问 xff0c 那么BLOCKED和WAITING有什么区别呢 xff1f 答复在JDK源码中可以找到 xff0c 如下是java lang
  • 随记-创建sftp用户并分配操作目录权限

    背景 xff1a 客户需要到我服务器上存取文件 xff0c 单独给他创建sftp账号 步骤 1 创建一个sftp用户 xff0c 名称暂定为sjzx sftp user xff0c 并修改密码 span class token functi
  • 【idea导入外部项目目录结构显示不完整解决方案】与【Maven配置永久生效方案】

    一 idea导入外部项目目录结构显示不完整 idea导入外部项目时 xff0c 目录结构显示不完整 xff0c 如下图所示 可能的情况即解决方案如下 xff1a 1 等待即可 xff1b idea正在下载项目所需依赖 xff0c 等待pom
  • Kotlin实现登录界面的密码显示与隐藏

    kotlin实现android登录界面 1布局的设计 xff0c 密码的显示和隐藏2主程序的监听事件的绑定 1布局的设计 xff0c 密码的显示和隐藏 span class token prolog lt xml version 61 34
  • Ubuntu18.04 设置 root 用户登录

    1 Ubuntu root用户 初始是没有密码的 xff0c 所以在使用之前最好先设置密码 xff0c 在终端使用以下指令 sudo passwd root 2 输入下方指令 xff0c 修改文件内容 xff0c 设置root用户登录 cd
  • 【Jetpack】学穿:ViewBinding → 视图绑定

    0x0 Jetpack简介 手机厂商还没卷完Android 12 xff0c Android 13 就悄然声息地来了 xff0c 距离Google 2008年9月22日发布Android 1 0 xff0c 已过去13个年头 历经13年的打
  • 如何做影视解说短视频?素材文案+配音,每一个都不能少

    如何做影视解说短视频 xff1f 素材文案 43 配音 xff0c 每一个都不能少 很多小伙伴都喜欢问我如何才能做出来一个影视解说短视频 xff0c 其实并没有我们想象中的那么难 只是如果想要做成大号 xff0c 变成拥有六千多万粉丝 xf
  • 如何抓住用户痛点进行短视频文案创作?三个小方法可运用

    如何抓住用户痛点进行短视频文案创作 xff1f 三个小方法可运用 众所周知 xff0c 短视频的文案创作 xff0c 其实也是需要抓住用户痛点的 xff0c 而只要能够做到这一点 xff0c 吸引用户其实就非常简单了 所谓抓住用户痛点 xf
  • 短视频文案怎么写才能吸引用户?幽默不是唯一,触发情感也很重要

    短视频文案怎么写才能吸引用户 xff1f 幽默不是唯一 xff0c 触发情感也很重要 很多做短视频的小伙伴们都会烦恼一件事 xff0c 那就是不知道短视频的文案究竟要怎么写才能够顺利的吸引到用户 很多小伙伴认为幽默的文案才能吸粉引流 xff
  • 短视频运营小技巧,标题文案都很重要,还有配音也别忘记

    短视频运营小技巧 xff0c 标题文案都很重要 xff0c 还有配音也别忘记 想要让自己的短视频获得高高的流量 xff0c 那么是离不开运营小技巧的 xff0c 那么今天我们就来分享三个短视频运营的小技巧 xff0c 标题文案都很重要 xf

随机推荐

  • java中怎样获取绝对路径,增加代码的灵活性?

    介绍获取绝对路径的方法 xff0c 一种是获取普通文件 xff0c 另一种是只能获取后缀名为 properties的文件 第一种 xff1a 在IO流读取文件时 xff0c 我们往往会通过直接写文件名的方式取 xff0c 例如 xff1a
  • tomcat学习笔记之catalina.sh

    本文基于tomcat 8 0 18版本的源码实现写作 xff0c 随tomcat7发布的脚本可能会有些差异 最早是在07年部门培训的时候接触到tomcat xff0c 但后来的工作都和web开发不相关 xff0c 所以没有积累多少使用经验
  • 24届春招百度暑假实习笔试第二题

    题干 解答 该题目在解决的时候 xff0c 需要发现就是对于相同的字符我们应该放在一起 xff0c 这样在进行修改的时候 xff0c 对其他字符的影响才会小 然后连续相同字符个数 和 组成的回文子串数目 它们的通解为 an 61 n 2 4
  • (二十三)操作系统-多生产者·多消费者问题

    文章目录 一 问题描述二 问题分析1 关系分析2 整理思路 三 实现1 代码2 如果不要互斥信号量3 将盘子 xff08 缓冲区 xff09 容量设为2 四 总结 一 问题描述 桌子上有一只盘子 xff0c 每次只能向其中放入一个水果 爸爸
  • 事件循环机制的理解

    点此链接
  • 【快速学习vue3】

    点此链接
  • 配置FTP协议 并且连接交换机进行文件传输

    配置FTP连接交换机进行文件传输 文章目录 配置FTP连接交换机进行文件传输前言一 FTP文件传输协议1 配置环境电脑验证 xff08 使用CMD直接ftp 43 进行连接的设备IP xff09 前言 本文为网络工程师培训中的学习笔记 xf
  • Mysql-最左前缀法则以及索引失效情况

    最左前缀法则 如果索引了多列 xff08 联合索引 xff09 xff0c 要遵守最左前缀法则 最左前缀法则指的是查询从索引的最左列开始 xff0c 并且不跳过索引中的列 如果跳跃某一列 xff0c 索引将会部分失效 后面的字段索引失效 以
  • Spring框架开发流程

    Spring框架是什么 xff1f Spring是一个开源框架 xff0c Spring是于2003 年兴起的一个轻量级的Java 开发框架 xff0c 由Rod Johnson 在其著作Expert One On One J2EE Dev
  • HJ71 字符串通配符

    描述 问题描述 xff1a 在计算机中 xff0c 通配符一种特殊语法 xff0c 广泛应用于文件搜索 数据库 正则表达式等领域 现要求各位实现字符串通配符的算法 要求 xff1a 实现如下2个通配符 xff1a xff1a 匹配0个或以上
  • 如何用Java实现判断一个链表是否有环

    设置一个快指针和一个慢指针 xff0c 快指针一次走两步 xff0c 慢指针一次走一步 如果该链表没有环 xff0c 快指针会先指向NULL xff0c 可据此判断链表没有环结构 xff1b 如果该链表有环 xff0c 则快指针肯定先进环
  • Arch Linux安装 2023-04-09

    除特殊场景外 下面所有的 34 34 后都是注释 准备 EFI分区不小于200mb iso版本 archlinux 2023 04 01 x86 64 使用分区工具预留出足够空间 gt 20G 标签为 未分配 安装 连接网络 rfkill
  • Spring Boot配置数据库链接池

    配置方法 基于当前的1 5 2 RELEASE的Spring Boot 依照官方文档 xff0c 如果增加了如下依赖的配置 xff0c 或者类路径中存在spring boot starter jdbc的jar xff0c 那么已默认启用了数
  • 一文搞懂Java中相对路径与绝对路径

    一文搞懂Java中相对路径与绝对路径 在java中路径分隔使用正斜杠 xff0c 不推荐使用反斜杠 xff08 因为反斜杠需要转义两个反斜杠表示一个正斜杠 xff09 在windows磁盘中用 反斜杠 表示路径的分隔在浏览器中用 正斜杠 来
  • 【向量的叉乘】

    一 二维向量叉乘公式 xff1a a xff08 x1 xff0c y1 xff09 xff0c b xff08 x2 xff0c y2 xff09 xff0c 则a b 61 xff08 x1y2 x2y1 xff09 二 a b 61
  • JAVA常用类

    Object类 Object类是类层次结构的根 xff0c 每个类都可以将Object作为超类 所有类都直接或者间接的继承该类 Object只有无参构造方法 Math类 包含执行基本数学运算的方法 Random类 伪随机数 java uta
  • Collections类 [Java]

    Collections工具类 Collections是一个操作Collection集合和Map集合的工具类 Collections不仅仅是操作Collection集合 还可以操作Map集合 Collection和Collections有什么
  • 我阿里P7了解到的Android面试的一些小内幕!已拿offer

    前言 这些题目是网友去百度 小米 乐视 美团 58 猎豹 360 新浪 搜狐等一线互联网公司面试被问到的题目 熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率 欢迎一线公司员工以及网友提交面试题库 xff0c 欢迎留言 网上的都是按
  • 7月编程排行榜来啦!这次有何新变化?

    每月编程排行榜可能会迟到 xff0c 但永远不缺席 7月的编程排行榜已出 xff0c 接下来一起看看有哪些看点吧 Tiobe编程排行榜前20名 Tiobe编程排行榜Top 10趋势 TIOBE Index编程社区指数是编程语言流行度的一个指
  • 操作系统 记录型信号量实现生产者消费者问题(完整代码)

    问题描述 用信号量模拟生产者 消费者问题的过程 生产者和消费者两个线程共享同一个缓冲区 xff0c 生产者不断向缓冲区中添加产品 xff0c 消费者从缓冲区中消费产品 要保证缓冲区满了之后生产者不能再继续添加产品 xff0c 需要等消费者至