试验1:生产者消费者问题.docx

上传人:scccc 文档编号:13239538 上传时间:2021-12-19 格式:DOCX 页数:10 大小:82.36KB
返回 下载 相关 举报
试验1:生产者消费者问题.docx_第1页
第1页 / 共10页
试验1:生产者消费者问题.docx_第2页
第2页 / 共10页
试验1:生产者消费者问题.docx_第3页
第3页 / 共10页
试验1:生产者消费者问题.docx_第4页
第4页 / 共10页
试验1:生产者消费者问题.docx_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《试验1:生产者消费者问题.docx》由会员分享,可在线阅读,更多相关《试验1:生产者消费者问题.docx(10页珍藏版)》请在三一文库上搜索。

1、v1.0可编辑可修改福建农林大学金山学院实验报告系(教研室): 专业: 计算机科学与技术年级: 实验课程: 生产者与消费者实验 姓名: 学号: 实验室号:1#608计算机号: 实验时间: 指导教师签字: 成绩: 实验1 :生产者消费者问题一、实验目的生产者消费者问题是操作系统中经典的同步和互斥问题。通过实验,要求学生掌握两者之间的同步信号量和互斥信号量的使用,更深刻了解临界资源、同步和互斥的概念。二、实验要求1. 一组生产者通过一个具有 N个缓冲区的缓冲池循环不断地向一组消费者提供产品。2. 建一个队列,队列的长度由n记录,定义两个指针,分别指向队列的头和尾消费者从头指针读取数据,每读取一个数

2、据把n-,生产者把数据写入尾指针, 每写入一个数据就 n+,当n=N的时候生产者暂停写入数据。3. 注意:缓冲池队列,用互斥锁保护。三、实验内容和原理1. 分别画出生产者和消费者的流程图否2. 针对生产者和消费者问题,可以分为哪几种情况,使用了哪些原语分别代表什 么意思过程如何阐述哪些进程之间存在同步,哪些进程之间存在互斥。3. 缓冲区是否为临界资源是否可以循环使用通过什么来实现举例说明(可画图)四、实验环境1. 硬件:PC机;2. 软件:Windows操作系统、五、算法描述及实验步骤#in elude <>#in elude <iostream> const un s

3、ig ned short SIZE_OF_BUFFER = 10; un sig ned short ProductID = 0;un sig ned short Con sumeID = 0;un sig ned short in = 0;un sig ned short out = 0;in t g_bufferSIZE_OF_BUFFER;bool g_continue = true;HANDLE g_hMutex;HANDLE g_hFullSemaphore;HANDLE g_hEmptySemaphore;DWORD WINAPI Producer(LPVOID);DWORD WI

4、NAPI Co nsumer(LPVOID);int mai n() g_hMutex = CreateMutex(NULL,FALSE,NULL);g_hFullSemaphoreCreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);const un sig ned short PRODUCERS_COUNT = 3;const un sig ned short CONSUMERS_COUNT

5、= 1;const un sig ned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLE hThreadsPRODUCERS_COUNT;DWORD producerlDCONSUMERS_COUNT;DWORD con sumerlDTHREADS_COUNT;for (int i=0;i<PRODUCERS_COUNT;+i)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerlDi);if (hThreadsi=NULL) return -1;

6、for ( i=0;i<CONSUMERS_COUNT;+i)hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Co nsumer,NULL,0,&con sumerlDi);if (hThreadsi=NULL) return -1;while(g_c ontinu e)if(getchar()."std:cerr << "Succeed" << std:e ndl;void Appe nd() std:cerr << "Appe nding a product

7、 ."g_bufferi n = ProductID;in = (in+1)%SIZE_OF_BUFFER;std:cerr << "Succeed" << std:e ndl;for (in t i=0;i<SIZE_OF_BUFFER;+i)std:cout << i <<": " << g_bufferi;if (i=in) std:cout << " <-生产"if (i=out) std:cout << " &

8、lt;-消费"std:cout << std:e ndl;void Take() std:cerr << "Taki ng a product ."Con sumeID = g_bufferout;out = (out+1)%SIZE_OF_BUFFER;std:cerr << "Succeed" << std:e ndl;for (in t i=0;i<SIZE_OF_BUFFER;+i)std:cout << i <<": " <<

9、 g_bufferi;if (i=in) std:cout << " <-生产"if (i=out) std:cout << " <-消费"std:cout << std:e ndl; void Con sume() std:cerr << "Consuming " << Con sumeID << "." std:cerr << "Succeed" << std:e ndl;DWORD

10、WINAPI Producer(LPVOID lpPara) while(g_c ontinu e)WaitForSi ngleObject(g_hFullSem aphore,INFINITE);WaitForSi ngleObject(g_hMutex,INFINITE);Produce();Appe nd();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);return 0;DWORD WINAPI Co nsumer(LPVOID lpPa while(g_c ontinu e)

11、WaitForSi ngleObject(g_hEmptySemaphore,INFINITE);WaitForSi ngleObject(g_hMutex,INFINITE);Take();Con sume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL);return 0;六、调试过程程序有错误:|CnFiguration: 1 - Vin32 DebugConpiliig.pLcppD:1167BB8Hdj1.tpp(94) : error C21M! syntax ernr :

12、ilfsliig beFon ldentifljer 'lilMSESufhonD;1167te_|1.cpp( 1H) ; error CMW; syntax error : nissing '/ before 'J'舲cl.exe軽卷l.obj - 1 errur(s), 9 uarniry(s)在94和108行分别少了两个封号。经改正后无错误如图所示:CionFiguration: 1 - Win32 DebugCompiling1 .cpp1 -obj - O error(s) T O uiarnimgfs)七、实验结果尻 *Ds l 167l0804417cLljVDsl)ug 1B ee*due ins 乂 Succeed ending a product - Succeed1 <"消费2e <生产B3 SucceedSucceed滾 product 消费生产100七、总结基本同步和互斥通过这次试验我了解了生产者消费者问题是操作系统中经典的同步和互斥问题。上掌握了两者之间的同步信号量和互斥信号量的使用,更深刻了解临界资源、的概念。并且在错误的调试中对知识有了更深的掌握。附录:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1