用PV操作 实现生产者-消费者问题(C++语言)

2023-05-16

/**
作者:wwj
时间:2012/4/12
功能:实现生产者和消费者正常活动

题目内容:生产者-消费者问题,是指两组进程共享一个环形的缓冲区。一组进程被称为生产者,另一组进程被称为消费者。
缓冲池是由若干个(程序假设为4个)大小相等的缓冲区组成的,每个缓冲区可以容纳一个产品。生产者进程不断地将生产的产品放入缓冲池,
消费者进程不断地将产品从缓冲池取出。用PV操作实现生产者和消费者的正常活动的程序

题目分析:
	在生产者-消费者问题中,既存在进程同步问题,也存在着临界区的互斥问题。当缓冲区都满时,表示供大于求,
生产者停止生产,进入等待状态,同时唤醒消费者;当缓冲区都空时,表示供不应求,消费者停止消费,唤醒生产者。
这说明了,生产者和消费者存在同步关系。
	对于缓冲池,它显然是一个临界资源,所有的生产者和消费者都要使用它,
而且都要改变它的状态,故对于缓冲池的操作必须是互斥的。

*/

#include<Windows.h>
#include<iostream>
using namespace std;
const int n=4;

//声明全局变量
int i=0,j=0;	//i和j分别指向缓冲区
int buffer[n];	//缓冲池
int ItemP=0;	//用来存放生产的产品
int ItemC=0;	//用来存放消费的产品

//声明句柄
HANDLE mutex;	//缓冲池信号量
HANDLE empty;	//空缓冲区信号量
HANDLE full;	//满缓冲区信号量
HANDLE pThread;	//producer线程句柄
HANDLE cThread;	//consumer线程句柄

//声明进程函数
DWORD WINAPI producer(LPVOID IpParameter);
DWORD WINAPI consumer(LPVOID IpParameter);

int main()
{
	//创建信号量
	mutex = CreateSemaphore(NULL,1,1,NULL);
	empty = CreateSemaphore(NULL,1,4,NULL);
	full = CreateSemaphore(NULL,0,4,NULL);

	cout<<"市场运作开始。。。。。"<<endl;

	//创建线程
	pThread = CreateThread(NULL,0,producer,NULL,0,NULL);
	cThread = CreateThread(NULL,0,consumer,NULL,0,NULL);

	//等待相应线程结束
	WaitForSingleObject(pThread,INFINITE); 
	WaitForSingleObject(cThread,INFINITE); 
	
	
	//关闭线程句柄
	CloseHandle(pThread);
	CloseHandle(cThread);

	//关闭信号量句柄
	CloseHandle(mutex);
	CloseHandle(empty);
	CloseHandle(full);

	cout<<"整个市场运营结束。。。。"<<endl;
	return 0;
}

	//producer线程函数的定义
	DWORD WINAPI producer(LPVOID IpParameter)
	{
		for(int k=0;k<5;k++)	
		{
			cout<<"\nproducer生产一个产品"<<endl;
			ItemP=ItemP+1;			//增加一个产品
			WaitForSingleObject(empty,INFINITE);	//P操作
			WaitForSingleObject(mutex,INFINITE);
			cout<<"\n把一个产品放入了一个空的缓冲区"<<endl;
			buffer[i]=ItemP;		//将产品放入缓冲区
			i=(i+1)%n;				
			ReleaseSemaphore(mutex,1,NULL);		//V操作
			ReleaseSemaphore(full,1,NULL);
		}
		return 0;
	}

	DWORD WINAPI consumer(LPVOID IpParameter)
	{
		for(int k=0;k<5;k++)
		{
			WaitForSingleObject(full,INFINITE);	//P操作
			WaitForSingleObject(mutex,INFINITE);
			ItemC=buffer[j];		//将缓冲区里的产品取出,放入消费产品里头
			j=(j+1)%n;				//j指向下一个满的缓冲区
			ReleaseSemaphore(mutex,1,NULL);		//V操作
			ReleaseSemaphore(empty,1,NULL);
			cout<<"\n消费者消费一个产品"<<endl;
			ItemC=ItemC-1;			//消费一个产品

		}
		return 0;
	}



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

用PV操作 实现生产者-消费者问题(C++语言) 的相关文章

  • VSCODE ssh免密连接远端服务器

    用vscode ssh远程开发时 xff0c 需要输入服务器密码 xff0c 才能正常连接 输入的次数多了就想改进下 既然是通过ssh连接的 xff0c 那么只需要做到ssh免密连接就可以了 具体操作如下 xff1a 1 本地电脑生成秘钥
  • 2022年12月编程语言排行榜,数据来了!

    2022年迎来了最后一个月 xff0c 我们可以看到 xff0c 在这一年中编程语言起起伏伏 xff0c 有的语言始终炙手可热 xff0c 而有的语言却逐渐 没落 日前 xff0c 全球知名TIOBE编程语言社区发布了12月编程语言排行榜
  • 黑马程序员:3分钟带你读懂C/C++学习路线

    随着互联网及互联网 43 深入蓬勃的发展 xff0c 经过40余年的时间洗礼 xff0c C C 43 43 俨然已成为一门贵族语言 xff0c 出色的性能使之成为高级语言中的性能王者 而在今天 xff0c 它又扮演着什么样重要的角色呢 x
  • Python+Matplotlib 制作排序算法的动画

    1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法 xff0c 现在还记得4年前手动实现常见8种排序算法 xff0c 通过随机生成一些数据 xff0c 逐个校验代码实现的排序过程是否与预期的一致 xff0c 越做越有劲 xff0c
  • 浏览器打不开某些网站是什么原因导致,试试用这些方法来解决

    不少小伙伴使用一些浏览器浏览网页的时候 xff0c 发现打不开某些网站 xff0c 这是什么原因导致的呢 本文讲汇总几个常见的原因 xff0c 我们可以通过以下几个原因排查 xff0c 并且使用下文的解决方法可以试试能否打开网站 打不开网站
  • Android设备的电池续航时间优化(Optimizing Battery Life)——(一)监听电池电量和电池的充电状态...

    当你想通过减少后台更新服务的更新频率来降低程序对电池的影响时 xff0c 检查电池当前的电量和充电状态将是一个比较好的起点 程序更新对电池造成的影响将取决于当前电池电量和充电状态 xff0c 比如说 xff0c 当设备正在充电的时候 xff
  • 如何利用github打造博客专属域名

    转载请标明出处 xff1a http blog csdn net lmj623565791 article details 51319147 xff1b 本文出自 张鸿洋的博客 一 概述 哈 xff0c 本篇博客不属于Android技术类的
  • 基于HTML5实现的在线3D虚拟试衣系统(试衣间)解决方案

    3D虚拟试衣系统的使用场景主要是在线电商或数字营销 xff0c 为品牌服装 服饰 饰品添加高端3D虚拟购物动效 xff0c 提升用户感官体验和交互体验 要研发这样的在线系统 xff0c 有2个方向 xff0c 一个是使用Flash或Unit
  • 2011移动开发者大会亮点之一:六大精彩主题论坛抢鲜看

    2011中国移动开发者大会将是2011年度中国最大规模的移动盛事 本次大会全面覆盖软件应用和服务 平台 运营商 终端 芯片等移动产业链各个领域 xff0c 与此同时 xff0c 专注于产业链中最活跃的因素 应用软件的研发 创新与商业模式 x
  • collections的max()

    java util Collections的max方法可以获得集合中的最大值 xff1b 之前取map的最大key值 xff0c 还得自己写方法 xff0c 原来有现成的 xff1b max Collection lt extends T
  • “河软CSDN2011级表彰暨实习动员大会”顺利召开!

    9点30分 伴随着激昂的开场曲 xff0c 主持人走到台前 xff01 河软CSDN2011级表彰暨 实习动员大会即将开始 xff0c 请各位嘉宾入场 xff01 他们分别是 CSDN教育事业部总经 理李天山先生 河北软件职业技术学院 软件
  • ubuntu系统adb shell无法连接设备解决方法

    1 问题描述 xff1a alex 64 ubuntu adb shell daemon not running starting now at tcp 5037 daemon started successfully error insu
  • IT毕业生给学弟学妹们的真心话——离校座谈记录

    活动 xff1a 2009级毕业生离校前座谈 地点 xff1a 烟台大学计算机学院4409学业指导工作室 组织 xff1a 烟台大学CSDN高校俱乐部 时间 xff1a 2013年6月1日 上午8 30 参加人员 xff1a 主持人 xff
  • 生活就是工作学习锻炼身体

    多做事情多学习 少浪费时间 业精于勤荒于嬉 xff0c 行成于思而毁于随
  • golang之路--时间格式化

    有人问了问go的时间格式化问题 xff0c 于是乎自己尝试了下 xff0c 发现巨坑爹 xff0c 不按常理出牌啊 format的竟然模版必须如下面的每个数字 fuck t 61 time Unix 1362984425 0 nt 61 t
  • 生产者消费者模式C++程序模拟实现

    关于生产者和消费者的分析可以参考 xff1a http blog csdn net kenden23 article details 16340673 这里是利用C 43 43 简单模拟一个生产者消费者的工作模式 没有考虑到同步问题 操作了
  • Active MQ C++实现通讯

    Active MQ C 43 43 实现通讯 Kagula 2011 9 13 简介 在参考资料 2 的基础上介绍如何用C 43 43 调用Active MQ的客户端API 环境 xff1a 1 Windows XP SP3 2 Visua
  • OA工作流设计思路——请大神点评啊

    lt p gt OA工作流设计思路 请大神点评啊 xff0c 很多可能想的不是很到位 lt p gt lt p gt 此设计思路暂时没有包含详细的设计 xff0c 就是一个方向 xff0c 请大神指正下 xff0c 然方案更加完善 xff0
  • 解决Spring AOP 事务 配置 失效原因

    采用AOP配置声明式事务有5种方式 xff0c 下面只说关于采用TransactionInterceptor事务拦截器的方式 xff0c 配置程序如下 xff1a transactionManager xff1a lt bean id 61
  • 兼容chrome与firefox使用offsetWidth得到不同值的问题

    Ext3 x Ext MessageBox alert 在chrome与firefox显示的宽度不一致问题 究其原因是因为msgEl getWidth 得到的值不一致导致的 修正宽度应方法 xff1a chrome xff1a rect 6

随机推荐

  • 内嵌标志表达式

    对应的内嵌标志表达式是 i xff0c 它有四种形式 xff1a 1 xff0c i 2 xff0c i 3 xff0c i X 4 xff0c i X 不带有 的是开标志 xff0c 带有 的是关标志 把上面的代码改成这样 xff1a J
  • LoadRunner 90 Percent设置

    90 Percent 的设置 xff1a tools xff08 工具 xff09 options xff08 选项 xff09 General选项卡最下面有个Summary Report
  • 高通8155平台YOCTO CMAKE 编译问题解决方法

    硬件平台 xff1a 高通8155 软件平台 xff1a yocoto linux 43 ubuntu16 04 最近开始接触8155平台 xff0c 发现编译阶段出现cmake编译失败 xff0c 网上搜了一下没有相关的解决方案 xff0
  • 解决Ext.Grid单元格不能被选择

    ExtJs3 x版本 xff0c Ext grid GridPanel单元格数据不能被选择 xff0c 在不同浏览器环境下的解决方法不同 xff1a 1 Chrome Safari xff1a ext webkit x grid panel
  • Hadoop-1.2 单机部署

    准备相关资源环境 运行环境工具 Linux Centos 6 3 JDK 1 7 0 51 SSH Secure Shell 1 下载Hadoop1 2 http mirrors cnnic cn apache hadoop common
  • Hbase-0.94.19 单机部署

    准备相关环境 运行环境工具 Linux Centos 6 3 JDK 1 7 0 60 Hadoop 1 2 1 SSH Secure Shell Hbase需建立在Hadoop环境之上运行 xff0c 参考Hadoop1 2 1单机部署
  • Android Beam:引领未来的NFC数据交换

    还记得吗 xff1f 惠普曾经将TouchPad平板电脑与Pre 3接触就实现了网页交换 也许那时大家都在想 xff1a 太酷啦 xff0c 要是我有TouchPad和pre3就好了 昨天新发布的Android 4 0Ice Cream S
  • TabHost设置选项卡被选中时背景颜色

    TabHost设置选项卡被选中时背景颜色 xff0c 通过给每个选项卡的Button设置背景样式实现 文件名 xff1a bottom btn first bg billboard xml 内容如下 xff1a lt xml version
  • 如何从文件中检索关键字出现的次数

    首先得到文件的完整路径 然后从流中读取每个字符 如果读出的字符和关键字的第一个字符相同 xff0c 则按照关键字长度读取相同个数的字符 分别判断是否相同 xff0c 若有一个不相同则break 否则计数器count 43 43 xff0c
  • 被其他Activity覆盖不触发onStop的情况

    被其他Activity覆盖不触发onStop的情况 xff1a 一般情况下当一个Activity被其他Activity覆盖时 被覆盖的Activity都会调用onStop xff08 xff09 方法 但是有两种情况除外 一个是上层Acti
  • 如何找到一个数组中第三大数字并输出它所在的位置

    面试题 如何找到一个数组中第三大数字并输出它所在的位置 延伸问题 xff1a 如何找到一个数组中第N大元素并输出它所在的位置 br public class FindThirdLarge br public static void getT
  • 输出出一个数组中出现次数最多的数字以及它出现的次数

    查找一个数组中出现次数最多的数字以及它出现的次数并输出出来 br public class FindMostAppearTime br public static void getMostAppearNumber int array br
  • Activity的四种启动模式

    color 61 red Standard color 默认启动模式 标准模式 每次启动Activity都会创建新的Activity对象实例 color 61 red SingleInstance color 只要在当前应用中启动过该Act
  • 可装载内核模块-Loadable Kernel Module (LKM)

    0x01 可装载模块分类 设备驱动 文件系统 系统调用 0x02 版本检查 Linux 的迅速发展致使相邻版本的内核之间亦存在较大的差异 xff0c 即在版本补丁号 xff08 Patch Level xff0c 即内核版本号的第四位数 x
  • couldn't load font "宋体 9", falling back to "Sans 9", expect ugly output.

    Windows下使用Ruby GNOME2写GUI时 xff0c 会报以下错误 xff1a Pango WARNING couldn 39 t load font 34 宋体 9 34 falling back to 34 Sans 9 3
  • TCP/IP数据包结构详解

    关键词 TCP IP 数据包 结构 详解 网络 协议 一般来说 xff0c 网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作 xff0c 但是一些特殊的情况下 xff0c 就需要深入的理解 网络数据包的结构 xff0c 以
  • Ubuntu 网络配制方法(同事的blog,拿来备份.)

    etc network interfaces 打开后里面可设置DHCP或手动设置静态ip 前面auto eth0 xff0c 让网卡开机自动挂载 1 以DHCP方式配置网卡 编辑文件 etc network interfaces sudo
  • 内存池:简单的内存池的实现

    转载自 xff1a http blog sina com cn s blog 46ed82810100ch8h html 当频繁地用malloc申请内存 xff0c 然后再用free释放内存时 xff0c 会存在两个主要问题 第一个问题是频
  • 浅谈如何学习linux

    一 为什么要学linux 当然最重要是爱好和兴趣 xff01 如果你这种必要学 xff0c 或者根本不喜欢 xff0c 请不要浪费时间 xff0c 你学也学不好 xff01 二 起步 你应该为自己创造一个学习linux的环境 在电脑上装一个
  • 用PV操作 实现生产者-消费者问题(C++语言)

    作者 xff1a wwj 时间 xff1a 2012 4 12 功能 xff1a 实现生产者和消费者正常活动 题目内容 xff1a 生产者 消费者问题 xff0c 是指两组进程共享一个环形的缓冲区 一组进程被称为生产者 xff0c 另一组进