生产者消费者实验报告

生产者消费者实验报告

ID:47509824

大小:379.79 KB

页数:8页

时间:2020-01-12

生产者消费者实验报告_第1页
生产者消费者实验报告_第2页
生产者消费者实验报告_第3页
生产者消费者实验报告_第4页
生产者消费者实验报告_第5页
资源描述:

《生产者消费者实验报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、实验二.生产者与消费者进程实验报告实验目的:利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。实验内容与步骤:1.进程的互斥与同步。编写一段程序,模拟生产者和消费者线程,实现进程的互斥与同步。2.利用VC++6.0实现上述程序设计和调试操作,对于生产者和消费者线程操作的成功与否提供一定的提示框。3.通过阅读和分析实验程序,熟悉进程的互斥与同步的概念。程序设计思路:关于这个生产者与消费者进程,我主要设计了两个线程,一个生产者线程,一个消费者线程。整个进程随着这两个线程的创建,运行,终止而进行。在程序的开始,首先

2、我创建了一个结构struct,它包括的基本数据有:生产物品缓冲区(用队列来表示),一个标志缓冲区空间多少的信号量m_S_Empty,一个标志缓冲区已有物品多少的信号量m_S_Full,一个互斥信号量m_M_Mutex防止生产者与消费者同时访问缓冲区间,一个判断生产者是否要结束生产的bool类型标志producerfinished,若为true,则两个线程都终止。进入主程序以后,首先对这些struct中的基本数据进行一个个赋值,然后创建生产者与消费者两个线程,等待两个线程都结束时,关闭进程。要知道在main主函数中两个线程的创建语句就是对两个线程各自进

3、入函数的运行,生产者函数中通过一个for循环,可以控制生产者进行多次生产,不是生产一次就结束了。消费者函数中通过一个while循环,当生产者没有结束生产时可以控制消费者进行多次消费,不是消费一次就不会再来消费了,除非生产者已结束生产,即producerfinished的值变为true。实验主要程序及注释:#include"stdafx.h"#include#include#include#includeusingnamespacestd;DWORDWINAPIConsume

4、r(void*);//声明消费者函数DWORDWINAPIProducer(void*);//声明生产者函数#defineN10//定义缓冲区数量/*数据结构的定义*/structMyData{HANDLEm_S_Empty;//生产者SemaphoreHANDLEm_S_Full;//消费者SemaphoreHANDLEm_M_Mutex;//互斥信号量queuefood;//定义共享缓冲区boolproducerfinished;//标志着生产者是否结束生产};intj=0;//只是为了输出方便观察线程执行次数intmain(){/*对

5、各个信号量赋值*/MyDatamydata;//创建一个MyData数据类型的实体mydatamydata.m_M_Mutex=CreateMutex(NULL,false,NULL);//"false"表示刚刚创建的这个信号量不属于®¨²任何线程mydata.m_S_Empty=CreateSemaphore(NULL,N,N,NULL);//初始计数为Nmydata.m_S_Full=CreateSemaphore(NULL,0,N,NULL);//初始计数为0mydata.producerfinished=false;//生产者结束标志刚开始设

6、置为false,表示没有结束/*创建生产者和消费者线程*/HANDLEhandles[2];handles[0]=CreateThread(NULL,0,&Producer,(void*)&mydata,0,0);handles[1]=CreateThread(NULL,0,&Consumer,(void*)&mydata,0,0);WaitForMultipleObjects(2,handles,true,INFINITE);//等待两个线程都结束才往下执行CloseHandle(mydata.m_M_Mutex);CloseHandle(myda

7、ta.m_S_Full);CloseHandle(mydata.m_S_Empty);}/*生产者函数*/DWORDWINAPIProducer(void*lp){MyData*md=(MyData*)lp;for(inti=0;i<100;i++){WaitForSingleObject(md->m_S_Empty,INFINITE);//缓冲区有空间才可以往下WaitForSingleObject(md->m_M_Mutex,INFINITE);//消费者没有在操作缓冲区生产者才可以执行/*将所生产的物品放到指定的缓冲区中*/md->food.p

8、ush(1);printf("%dt生产1个物品,共有%d个物品tt%d",j++,md->foo

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。