实验二 生产者-消费者问题

实验二 生产者-消费者问题

ID:9986922

大小:101.50 KB

页数:10页

时间:2018-05-19

实验二  生产者-消费者问题_第1页
实验二  生产者-消费者问题_第2页
实验二  生产者-消费者问题_第3页
实验二  生产者-消费者问题_第4页
实验二  生产者-消费者问题_第5页
资源描述:

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

1、实验二生产者-消费者问题实验目的掌握进程同步和互斥算法,掌握WIN32API中基本的同步对象,使用WIN32API解决实际问题。实验内容生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。本实验要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

2、当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。本实验要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数值,本实验中取N=16)。你需要使用如下信号量:l一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表;l一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;l一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;下面给出的是解决这一问题的伪代码,你可

3、以在此基础上编写自己的程序:#defineN16//定义信号量semaphoremutex=1;semaphorefull=0;semaphoreempty=N;//定义共享缓冲区buf_typebuffer[N];main(…){…//创建生产者和消费者线程CreateThread(…,Producer,…);CreateThread(…,Consumer,…);…}Producer(){buf_type*nextp;while(TRUE){10sleep(rand);//休眠一段随机时间produ

4、ce_item(nextp);//生产一个物品P(empty);//请求一个空缓冲区//操作缓冲区池P(mutex);addnextptobuffer;//将物品放置在一个空缓冲区中printf(“produceanewitemtothe%d-thslot”,….);V(mutex);//用信号通知一个满的缓冲区V(full);}}Consumer(){buf_type*nextc;while(TRUE){sleep(rand);//休眠一段随机时间P(full);//请求一个满缓冲区//操作缓冲区池

5、P(mutex);removeanitemtonextc;//获得物品,然后释放缓冲区printf(“consumeaniteminthe%d-thslot”,….);V(mutex);//用信号通知一个空的缓冲区V(empty);}}上述伪代码只是为了提供一个解决问题的思路,与Windows的同步原语无关。你可以根据需要选用Windows提供的同步对象(包括信号量、互斥量、事件、临界区等)编写自己的代码。该问题有许多解决方法,你应该认真研究Windows的各种不同的同步对象,并在自己的程序中做出适当

6、的选择。实验要求需要提交源程序代码(应当有适量注释)和实验报告,实验报告应包括完成人(姓名、学号)和结果分析(或错误原因分析)注意:程序和实验报告请用Winrar经打包压缩后通过FTP提交到相应子目录;为了检查方便,Winrar附件一律命名为:OS+学号(们)+_02,例如OS10301014_02.rar。10实验可能涉及到的主要API函数互斥对象互斥对象运行在内核模式,具有全局性,不同的进程都能够访问。这样利用互斥对象就可以让不同的进程中的线程互斥访问一个共享资源。但是因为用这个函数操作系统需要进

7、行用户态到核心态的转换,来回转换需要消耗较多的CPU时间。和互斥相关的函数有:HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbInitialOwner,LPCTSTRlpName);BOOLReleaseMutex(HANDLEhMutex);ReleaseMutex函数功能:该函数放弃指定互斥对象的拥有权。函数原型:BOOLReleaseMutex(HANDLEhMutex);参数:hMutex:互斥对象句柄。为Create

8、Mutex或OpenMutex函数的返回值。返回值:如果函数调用成功,那么返回值是非零值;如果函数调用失败,那么返回值是零值。若想获得更多错误信息,请调用GetLastError函数。备注:如果调用线程不拥有互斥对象,ReleaseMutex函数失败。当互斥对象的所有者线程不再需要互斥对象时,它可以调用ReleaseMutex函数。当一个线程拥有一个互斥对象后,它可以用该互斥对象多次调用等待函数而不会阻塞。这防止一个线程等待一个它已拥有的互斥对象时出现死

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

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

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