1 / 6
文档名称:

进程同步(生产者与消费者).pdf

格式:pdf   大小:626KB   页数:6页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

进程同步(生产者与消费者).pdf

上传人:1781111**** 2024/4/14 文件大小:626 KB

下载得到文件列表

进程同步(生产者与消费者).pdf

相关文档

文档介绍

文档介绍:该【进程同步(生产者与消费者) 】是由【1781111****】上传分享,文档一共【6】页,该文档可以免费在线阅读,需要了解更多关于【进程同步(生产者与消费者) 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..件学院操作系统实验报告业:软件工程班级:RB软工互152学号:201560160226学生姓名:王泽华指导教师:韩新超/6:..:进程同步(生产者与消费者))理解进程竞争资源的现象,进而理解进程的同步于互斥;2)掌握基本的互斥与同步算法,进一步理解“生产者—消费者”模型;3)通过对“生产者—消费者”问题编程实现,了解进程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法;4)进一步理解P、V原语和信号量在线程互斥和同步机制中的运用。。、该实验中使用到相关的windowsAPI函数:1)createThread建立新的线程;2)createMutex创建一个互斥体;3)createSemaphore创建一个新的信号量;4)releaseMutex释放由线程拥有的一个互斥体;5)releaseSemaphore对指定的信号量增加指定的值;6)waitforSingleObject用来检测handle时间的信号状态;7)waitforMultipleObjectstrue即等待所有信号量有效再往下执行,false当其中一个信号量有效时向下执行;8)CloseHandle关闭一个内核对象。2、数据结构用实验一中的进程就绪队列,并在此基础上进行调度,如果队列排序与算法要求不一致则编写一个排序函数。3、进程调度算法:选择一种进程调度算法实现。4、主界面设计:在实验一的界面上增加一个进程调度按钮、被调进程的PCB显示。5、功能测试:从显示出的就绪队列状态和被调进程的PCB,查看操作的正确与否。:..(2)结果分析:①在每个过程中先做,后做V(mutex),二者要成对出现。夹在二者中间的代码段就是该进程的临界区。②对同步信号量full和empty的P,V操作同样必须成对出现,但它们分别位于不同的程序中。③无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠倒:应先执行同步信号量的P操作,然后执行互斥信号量的P操作。否则可能造成进程死锁。,极大的改善了系统资源的利用率和提高了系统的吞吐量,但是由于多道环境中同时存在多个进程,它们共享系统资源,各自按/6:..照各自的方式执行,给系统造成了混乱,所以系统必须提供一种机制管理进程,使这些并发执行的进程之间能有条不紊地运行,能有效地共享资源和相互合作,使得程序的执行具有可再现性,这就是进程同步的主要任务。#include<iostream>#include<>#include<>usingnamespacestd;//生产者消费者问题,单个生产者,多个消费者,多个缓冲池//使用信号量和关键段来实现usingnamespacestd;intgi,gj;constintnum=10;//产生数据的个数constintsize=4;//缓冲池的大小volatileboolflag=true;//用于消费者线程之间intbuf[size];//缓冲池CRITICAL_SECTIONgc;//关键段HANDLEempty,full;//Semaphoreunsignedint__stdcallpro(PVOIDp)//生产者线程{for(inti=0;i<=num;i++){WaitForSingleObject(empty,INFINITE);//线程同步EnterCriticalSection(&gc);//线程互斥buf[gi]=i;生产者在号缓冲池放入gi=(gi+1)%size;LeaveCriticalSection(&gc);/6:..ReleaseSemaphore(full,1,NULL);}生产者运行结束return0;}unsignedint__stdcallcus(PVOIDp)//消费者线程{while(true){WaitForSingleObject(full,INFINITE);//线程同步if(flag==false)//线程之间的逻辑判断{break;}EnterCriticalSection(&gc);//线程互斥线程在缓冲池获取数据endl;if(buf[gj]==num)//结束条件{LeaveCriticalSection(&gc);ReleaseSemaphore(full,1,NULL);flag=false;break;}gj=(gj+1)%size;LeaveCriticalSection(&gc);Sleep(50);ReleaseSemaphore(empty,1,NULL);}/6:..消费者线程运行结束return0;}intmain(){//相关变量的定义constintsz=3;gi=gj=0;InitializeCriticalSection(&gc);empty=CreateSemaphore(NULL,4,4,NULL);full=CreateSemaphore(NULL,0,4,NULL);HANDLEhand[sz];hand[0]=(HANDLE)_beginthreadex(NULL,0,pro,NULL,0,NULL);//创建了三个线程hand[1]=(HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL);hand[2]=(HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL);WaitForMultipleObjects(sz,hand,true,INFINITE);//资源的释放CloseHandle(full);CloseHandle(empty);DeleteCriticalSection(&gc);for(inti=0;i<sz;i++){CloseHandle(hand[i]);}return0;}/6