操作系统生产者与消费者问题资料_第1页
操作系统生产者与消费者问题资料_第2页
操作系统生产者与消费者问题资料_第3页
操作系统生产者与消费者问题资料_第4页
操作系统生产者与消费者问题资料_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统(生产者与消费者问题)精品文档实验二 进程的互斥与同步(生产者与消费者问题)一、 实验目的: 利用 Windows提供的 API 函数,编写程序,解决生产者与消 费者问题,实现进程的互斥与同步。二、 实验内容与步骤: 本实验要求设计并实现一个进程,该进程拥有一个生 产者线程和一个消费者线程,它们使用 N 个不同的缓冲区( N为一个确定的 数值,例如 N=32)。生产者生产产品,将产品放入缓冲区,如果缓冲区满 了,就不能生产产品了,等到缓冲区有空了再生产,消费者线程消费产品, 从缓冲区取出产品消费,如果缓冲区是空的,就不能消费,线程挂起,生产 者与消费者不能同时对缓冲区操作。需要使用如下

2、信号量: 一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表; 一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发 出信号; 一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程 发出信号;编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。利用 VC+6.0 实现上述程序设计和调试操作,对于生产者和消费者线程操 作的成功与提供一定的提示框。 通过阅读和分析实验程序,熟悉进程的互斥与同步的概念。实验代码:#include#include using namespace std;const unsigned short N=5;/ 定义缓冲区的大小 H

3、ANDLE m_S_Empty; / 生产者 SemaphoreHANDLE m_S_Full; / 消费者 SemaphoreHANDLE m_M_Mutex;/互斥int bufferN; /定义共享缓冲区unsigned short ProductID = 0; /产品号unsigned short ConsumeID = 0; /将被消耗的产品号unsigned short in = 0; /产品进缓冲区时的缓冲区下标unsigned short out = 0; /产品出缓冲区时的缓冲区下标bool flag = true; /控制程序结束DWORD WINAPI Producer(

4、LPVOID); / 生产者线程 DWORD WINAPI Consumer(LPVOID); / 消费者线程初始计数为 Nint main()m_S_Empty = CreateSemaphore(NULL, N, N, NULL); /收集于网络,如有侵权请联系管理员删除精品文档初始计数为 0创建生产者线程创建消费者线程m_S_Full = CreateSemaphore(NULL, 0, N, NULL);/ m_M_Mutex = CreateMutex(NULL,FALSE,NULL); CreateThread(NULL,0,Producer,NULL,0,NULL);/ Crea

5、teThread(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 放入一个产品 . ;bufferin = ProductID;in = (in+1)%N;cout 放入成功 endl;/ 输出缓冲区当前的状态for (

6、int i=0;iN;i+)std:couti: bufferi;if(i=in) cout -生产 ;if(i=out) cout -消费 ;coutendl;void Take()cout 取出一个产品 . ;ConsumeID = bufferout;out = (out+1)%N;cout 取出成功 endl;/ 输出缓冲区当前的状态for (int i=0;iN;i+)couti: bufferi;收集于网络,如有侵权请联系管理员删除精品文档生产 ;消费 ;if(i=in) cout -if(i=out) cout -coutendl;DWORD WINAPI Producer(LP

7、VOID) while(flag)if(WaitForSingleObject(m_S_Empty,INFINITE)=WAIT_OBJECT_0) if(WaitForSingleObject(m_M_Mutex,INFINITE)=WAIT_OBJECT_0)Produce();/ 生产一个物品Append();/ 将所生产的物品放到指定的缓冲区中Sleep(1500);ReleaseMutex(m_M_Mutex);ReleaseSemaphore(m_S_Full, 1, NULL);return 0;DWORD WINAPI Consumer(LPVOID) while(flag) if(WaitForSingleObject(m_S_Full,INFINITE)=WAIT_OBJECT_0)if(WaitForSingleObject(m_M_Mutex,INFINITE)=WAIT_OBJECT_0)Take();/ 取出一个物品Consume();/ 消费一个产品 Sleep(1500);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论