操作系统生产者消费者同步机制

上传人:飞*** 文档编号:51580610 上传时间:2018-08-15 格式:PDF 页数:10 大小:109.77KB
返回 下载 相关 举报
操作系统生产者消费者同步机制_第1页
第1页 / 共10页
操作系统生产者消费者同步机制_第2页
第2页 / 共10页
操作系统生产者消费者同步机制_第3页
第3页 / 共10页
操作系统生产者消费者同步机制_第4页
第4页 / 共10页
操作系统生产者消费者同步机制_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《操作系统生产者消费者同步机制》由会员分享,可在线阅读,更多相关《操作系统生产者消费者同步机制(10页珍藏版)》请在金锄头文库上搜索。

1、计算机操作系统进程同步课程名称:计算机操作系统姓名:班级:学号:目录一、实验目的 . 3二、实验内容 . 3三、实验要求 . 3四、实验设计分析 34.1 生产者消费者原理分析 34.2 生产者消费者功能分析 44.3 数据结构分析 44.4 设计实现分析 44.5 实验流程分析 4五、实验过程 . 5六、实验结果 . 9七、实验总结 . 9实验一进程同步一、实验目的(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。(2)了解 linux中多线程的并发执行机制,线程间的同步和互斥。学会使用同步机制。二、实验内容一组生产者向一组消费者提供产品,它们共享一个有界缓冲池,生产者向其中放

2、入产品, 消费者从中取得产品。 假定这些生产者和消费者互相等效,只要缓冲池未满, 生产者可将产品送入缓冲池;只要缓冲池未空, 消费者可从缓冲池取走一个产品。 根据进程同步机制, 编写一个解决上述问题的可视化程序,可显示缓冲池状态、放产品、取产品等过程。三、实验要求1. 用 vc+6.0 2. 界面友好3. 自定义数据结构4. 实验报告书写请参考附录四、实验设计分析4.1 生产者消费者原理分析在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产

3、者线程必须等待消费者线程释放出一个空缓冲区。 当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。4.2 生产者消费者功能分析生产者功能描述:在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。消费者功能描述:消费者线程从缓冲区中获得物品,然后释放缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。4.3 数据结构分析g_bufferSIZE_OF_BUFF

4、ER 缓冲区队列ProductID 产品号ConsumeID 被消耗的产品号in 产品进缓冲区时的缓冲区下标out 产品出缓冲区时的缓冲区下标Producer(LPVOID) 生产者线程Consumer(LPVOID) 消费者线程当缓冲池为空时,生产者生产产品in 缓冲池 in=in+1 当缓冲池为满时,消费者消费产品out 缓冲池 out=out+1 4.4 设计实现分析1. 利用函数 CreateMutex(NULL,FALSE,NULL) 创建互斥信号量g_hMutex,表 示缓冲区当前的状态,若为true 时,则表示缓冲区正被别的进程使用。三个参 数表示的意义分别为:指向安全属性的指针

5、,初始化互斥对象的所有者, 指向互 斥对象名的指针, 2. 利用函数 CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL)创建缓冲 区满的信号量 g_hFullSemaphore,值为 true 时表示缓冲区已满。四个参数分别为: 表示是否允许继承、 设置信号机的初始计数、 设置信号机的最大计数、 指定信号 机对象的名称( -1是因为计数从开始) 3. 利用函数 CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)创建缓冲 区空的信号量 g_hEmptySemaphore ,该值为 tru

6、e 时表示缓冲区为空。4.5 实验流程分析五、实验过程及代码实现实验代码:#include #include const unsigned short SIZE_OF_BUFFER = 4; /缓冲区长度unsigned short ProductID = 0; /产品号unsigned short ConsumeID = 0; /将被消耗的产品号unsigned short in = 0; /产品进缓冲区时的缓冲区下标unsigned short out = 0;/产品出缓冲区时的缓冲区下标int g_bufferSIZE_OF_BUFFER; /缓冲区是个循环队列bool g_contin

7、ue = true; /控制程序结束HANDLE g_hMutex; /用于线程间的互斥HANDLE g_hFullSemaphore; /当缓冲区满时迫使生产者等待HANDLE g_hEmptySemaphore; /当缓冲区空时迫使消费者等待DWORD WINAPI Producer(LPVOID); /生产者线程DWORD WINAPI Consumer(LPVOID); /消费者线程开始Produce Wait Buffer Wait Products Consume 结束While produce While consume int main() /创建各个互斥信号g_hMutex

8、= 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 = 2 ; /生产者的个数const unsigned short CONSUMERS_COUNT = 1; /消费者的个数const unsigned short TH

9、READS_COUNT= PRODUCERS_COUNT+CONSUMERS_COUNT; /总的线程数HANDLE hThreadsPRODUCERS_COUNT; /各线程的handle DWORD producerIDCONSUMERS_COUNT; /生产者线程的标识符DWORD consumerIDTHREADS_COUNT; /消费者线程的标识符/创建生产者线程for (int i=0;iPRODUCERS_COUNT;+i) hThreadsi=CreateThread(NULL,0,Producer,NULL,0, if (hThreadsi=NULL) return -1;

10、/创建消费者线程for (int j=0; jCONSUMERS_COUNT; +j) hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0, if (hThreadsj=NULL) return -1; while(g_continue) if(getchar() /按回车后终止程序运行g_continue = false; return 0; /生产一个产品。void Produce() std:cerr “生产 “ +ProductID ; / “.“; /cerr C+ 的一种输出可变为cout std:cerr “

11、 产品完毕 “ std:endl; /把新生产的产品放入缓冲区void Append() g_bufferin = ProductID; in = (in+1)%SIZE_OF_BUFFER; /输出缓冲区当前的状态printf(“n当前缓冲区状态为n“); for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i “: “ g_bufferi; if (i=in) std:cout “ - 生产 “; if (i=out) std:cout “ - 消费 “; std:cout std:endl; /从缓冲区中取出一个产品void Take() ConsumeI

12、D = g_bufferout; out = (out+1)%SIZE_OF_BUFFER; /输出缓冲区当前的状态printf(“n当前缓冲区状态为n“); for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i “: “ g_bufferi; if (i=in) std:cout “ - 生产 “; if (i=out) std:cout “ - 消费 “; std:cout std:endl; /消耗一个产品void Consume() std:cerr “消费 “ ConsumeID ; std:cerr “ 成功 “ std:endl; /生产者DWO

13、RD WINAPI Producer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0; /消费者DWORD WINAPI Consumer(LPVOID lpPara) while(g

14、_continue) WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0; 六、实验结果七、实验总结本次课程设是关于生产者与消费者之间互斥和同步的问题。问题的实质是P、V 操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候, 另一个让其等待直到前一个线程释放缓冲区为止。我自己认为对于我来说编写这个程序有点困难,因为不知道怎么利用P、V操作来编写生产者和消费者的程序, 有点无从下手, 通过查找课外资料和网上的资料,对和有了一定的了解,参照参考书上的指点以及网络资源编写出来的. C/C+编程和 PV原语的编写更需要平时多加练习才能学好用好。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号