- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统(生产者与消费者问题)
精品文档
精品文档
收集于网络,如有侵权请联系管理员删除
收集于网络,如有侵权请联系管理员删除
精品文档
收集于网络,如有侵权请联系管理员删除
实验二 进程的互斥与同步
(生产者与消费者问题)
实验目的:利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。
实验内容与步骤:本实验要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数值,例如N=32)。生产者生产产品,将产品放入缓冲区,如果缓冲区满了,就不能生产产品了,等到缓冲区有空了再生产,消费者线程消费产品,从缓冲区取出产品消费,如果缓冲区是空的,就不能消费,线程挂起,生产者与消费者不能同时对缓冲区操作。需要使用如下信号量:
一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;
一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;
一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;
编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。
利用VC++6.0实现上述程序设计和调试操作,对于生产者和消费者线程操作的成功与
提供一定的提示框。
通过阅读和分析实验程序,熟悉进程的互斥与同步的概念。
实验代码:
#include<windows.h>
#include<iostream>
using namespace std;
const unsigned short N=5;//定义缓冲区的大小
HANDLE m_S_Empty; // 生产者Semaphore
HANDLE m_S_Full; // 消费者Semaphore
HANDLE m_M_Mutex;//互斥
int buffer[N]; //定义共享缓冲区
unsigned short ProductID = 0; //产品号
unsigned short ConsumeID = 0; //将被消耗的产品号
unsigned short in = 0; //产品进缓冲区时的缓冲区下标
unsigned short out = 0; //产品出缓冲区时的缓冲区下标
bool flag = true; //控制程序结束
DWORD WINAPI Producer(LPVOID); //生产者线程
DWORD WINAPI Consumer(LPVOID); //消费者线程
int main(){
m_S_Empty = CreateSemaphore(NULL, N, N, NULL); //初始计数为N
m_S_Full = CreateSemaphore(NULL, 0, N, NULL);//初始计数为0
m_M_Mutex = CreateMutex(NULL,FALSE,NULL);
CreateThread(NULL,0,Producer,NULL,0,NULL);//创建生产者线程
CreateThread(NULL,0,Consumer,NULL,0,NULL);//创建消费者线程
while(flag){
if(getchar()){ //按回车后终止程序运行
flag = false;
}
}
return 0;
}
void Produce(){
cout<<"产品生产中"<<++ProductID<<" ... ";
cout<<"生产成功"<<endl;
}
void Consume(){
cout<<"产品消费中"<<ConsumeID<<" ... ";
cout<<"消费成功"<<endl;
}
void Append(){
cout<<"放入一个产品... ";
buffer[in] = ProductID;
in = (in+1)%N;
cout<<"放入成功"<<endl;
//输出缓冲区当前的状态
for (int i=0;i<N;i++){
std::cout<<i<<": "<<buffer[i];
if(i==in) cout<<" <-- 生产";
if(i==out) cout<<" <-- 消费";
cout<<endl;
}
}
void Take(){
cout<<"取出一个产品... ";
ConsumeID = buffer[out];
out = (out+1)%N;
cout<<"取出成功"<<endl;
//输出缓冲区当前的状态
for (int i=0;i<N;i++
1亿VIP精品文档
相关文档
最近下载
- 刘亦菲英文介绍.ppt
- 16款奔驰GLA200快速使用指南.pdf
- 《GB/T 30104.303-2021数字可寻址照明接口 第303部分:特殊要求 输入设备 占位传感器》.pdf
- 入团积极分子谈话记录(通用5篇).docx VIP
- 《健康教育学》PPT6-健康饮食.pptx VIP
- 京东言犀数字人介绍 2023年 -解决方案中心.docx
- 2024年04月云南省社区(村)基层治理专干招考聘用5000人笔试历年高频考点试题后附答案详解.docx VIP
- 第一章 第一节 物质的分类和转化ppt— 上学期高一化学人教版(2019)必修第一册.pptx
- 年产5万吨丙酮工艺设计.doc
- 2024年04月云南省社区(村)基层治理专干招考聘用5000人笔试历年高频考题摘选后附答案详解.docx VIP
文档评论(0)