logo资料库

操作系统实验报告_生产者-消费者问题算法的实现.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
肇庆学院计算机学院 实 验 报 告 专业网络工程 班级 10 网工 1 班 姓名 学号课程名称计算机操作系统 学年 2011 --2012 学期 1□ / 2□ 实验名称:实验四 生产者――消费者问题算法的实现(选做) 课程类别 专业必修□ 限选□ 任选□ 实践□  实验内容: 实验时间:2012 年 5 月 9 日 1.问题描述:一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消 费者从中取得消息。假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池, 只要缓冲池未空,消费者可从缓冲池取走一个消息。 2.功能要求:根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等 过程。 C  实验目的及要求: 一、目的 1.了解信号量的使用。 2.加深对信号量机制的理解。 二.要求 1.理解生产者与消费者问题模型,掌握解决该问题的算法思想。 2.掌握正确使用同步机制的方法。  实验内容、方法与步骤:(使用附页填写并附在本页后)  实验结果:(使用附页填写并附在本页后)  小结: 本次课程设是关于生产者与消费者之间互斥和同步的问题。问题的实质是 P、V 操作,实验设一个共享缓 冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放 缓冲区为止。生产者与消费者是一个与现实有关的经典问题,与“和尚挑水”问题的原理相同,通过此原 理举一反三可以解决其他类似的问题。 过本课程设计,我们对操作系统的 p、v 进一步的认识,深入的了解 p、v 操作的实质和其重要性。课本的 理论知识进一步阐述了现实中的实际问题。 分数: 批阅老师: 2012 年 月 日 - 1 -
肇庆学院计算机学院 实验报告(附页)  实验内容、方法与步骤: 实验方法与步骤: 1.生产者功能描述: 在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中 供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费 者线程释放出一个空缓冲区。 2.消费者功能描述: 消费者线程从缓冲区中获得物品,然后释放缓冲区。当消费者线程消费物品时,如果没有满的缓冲区, 那么消费者线程将被阻塞,直到新的物品被生产出来。 3. 程序结构图: 4. 数据结构分析 (1)生产者与消费者实现: 这其中主要是通过多线程,来实现生产者和消费者之间的协调问题。 (2)生产者(producer)——消费者(consumer): 通过一些记录性变量,来记录模拟实现生产者的行为,通过输入语句的提示 程序采用 OO 设计模式,缓存区采用数组结构存储。 5. 生产者与消费者问题算法的实现代码 #include #include 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() { //产品进缓冲区时的缓冲区下标 //产品出缓冲区时的缓冲区下标 //缓冲区是个循环队列 //产品号 //将被消耗的产品号 //当缓冲区满时迫使生产者等待 //当缓冲区空时迫使消费者等待 //控制程序结束 //用于线程间的互斥 //生产者线程 //消费者线程 - 2 -
//创建各个互斥信号 g_hMutex = CreateMutex(NULL,FALSE,NULL); 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 = 1; //总的线程数 const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreads[PRODUCERS_COUNT]; //各线程的 handle DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符 DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符 //创建生产者线程 for (int i=0;i
for (int i=0;i
WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); } return 0; }  实验结果: 1.一个消费者三个生产者: 2.三个生产者三个消费者: - 5 -
3.三个消费者一个生产者: 4.三个生产者四个消费者 - 6 -
分数: 批阅老师: 200 年 月 日 - 7 -
- 8 -
分享到:
收藏