生产者与消费者实验报告.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
生产者和消费者实验报告 【实验目的】 加深对进程概念的理解,明确进程和程序的区别。 进一步认识并发执行的实质。 验证用信号量机制实现进程互斥的方法。 验证用信号量机制实现进程同步的方法。 【实验要求】 用c语言编程搭建"生产者和消费者"经典进程通信问题的环境。要求程序运行时,按任意键停止,显示当前系统的各个参数的值。提交实验报告,以及相关程序列表。打包成附件上传。 【实验环境】 Visual C++6.0 【实验内容】 1.了解经典同步问题"生产者和消费者" 生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费者则可不断地每次从缓冲池中取出一个产品。指针i和指针j分别指出当前的第一个空缓冲块和第一个满缓冲块。 2.分析和理解 (1)既存在合作同步问题,也存在临界区互斥问题 合作同步:当缓冲池全满时,表示供过于求,生产者必须等待,同时唤醒消费者;当缓冲池全空时,表示供不应求,消费者应等待,同时唤醒生产者。 互斥:缓冲池显然是临界资源,所在生产者与消费都要使用它,而且都要改变它的状态。 (2)基于环形缓冲区的生产 与消费者关系形式描述: 公用信号量mutex:初值为1,用于实现临界区互斥 生产者私用信号量empty:初值为n,指示空缓冲块数目 消费者私用信号量full:初值为0,指示满缓冲块数目 整型量i和j初值为0,i指示首空缓冲块序号,j指示首满缓冲块序号 (3)PV原语 var mutex,empty,full:semaphore; i,j:integer;buffer:array[0...n-1] of item; i:=j:=1; Procedure producer; begin while true do 生产者与消费者实验报告全文共9页,当前为第1页。begin 生产者与消费者实验报告全文共9页,当前为第1页。 produce a product; P(empty); P(mutex); buffer(i):=product; i:=(i+1) mod n; V(mutex); V(full); end; end; Procedure consumer; begin P(full); P(mutex); goods:=buffer(j); j:=(j+1) mod n; V(mutex); V(empty); consume a product; end; end; 【实验源程序代码】 #include <windows.h> #include <iostream> const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度 unsigned short ProductID = 0; //产品号 unsigned short ConsumeID = 0; //将被消耗的产品号 unsigned short in = 0; //产品进缓冲区时的缓冲区下标 unsigned short out = 0; //产品出缓冲区时的缓冲区下标 int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列 bool g_continue = true; //控制程序结束 HANDLE g_hMutex; //用于线程间的互斥 HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); //生产者线程 DWORD WINAPI Consumer(LPVOID); //消费者线程 int main() { //创建各个互斥信号 生产者与消费者实验报告全文共9页,当前为第2页。 g_hMutex = CreateMutex(NULL,FALSE,NULL); 生产者与消费者实验报告全文共9页,当前为第2页。 g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); //调整下面的数值,可以发现,当生产者个数多于消费者个数时, //生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCERS_COUNT = 3; //生产者的个数 const unsigned short CONSUMERS_COUNT =
- 粉丝: 167
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页