实验二 生产者消费者问题_第1页
实验二 生产者消费者问题_第2页
实验二 生产者消费者问题_第3页
实验二 生产者消费者问题_第4页
实验二 生产者消费者问题_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子科技大学信息与软件学院实验报告(实验)课程名称计算机操作系统学生姓名康彪学生学号2013220202022电子科技大学教务处制表实验名称:生产者/消费者问题的实现实验学时:2实验内容和目的:实验目的:通过本实验掌握进程间的同步和互斥机制的使用。实验内容:1、有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池:生产者进程从文件中读取一个数据,并将它存放到一个缓冲区中;消费者进程从一个缓冲区中取走数据,并输出此数据。生产者和消费者之间必须保持同步原则:不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。2、创建3进程(或者线程)作为生产者,4个进程(或者线程)作为消费者。创建一个文件作为数据源,文件中事先写入一些内容作为数据。3、生产者和消费者进程(或者线程)都具有相同的优先级。实验原理:利用进程间共享的信号量、互斥锁等控制线程的同步。相关函数说明:信号量sem_tsem_init信号量初始化)、sem_wait(信号量值减一)、sem_post(信号量值加一)互斥量(线程)pthread_mutex_tpthread_mutex_init(互斥量初始化)pthread_mutex_lock(互斥量加锁)pthread_mutex_unlock(互斥量解锁)线程和进程pthread_t(线程)pid_t(进程)pthread_create(创建线程)fork(创建进程)pthread_join(等待线程结束)waitpid(停止目前进程的执行,直到有信号来到或子进程结束)实验器材(设备、元器件)学生每人一台PC,安装WindowsXP/2000操作系统。局域网络环境。个人PC安装VMware虚拟机和Ubuntu系统。实验步骤:1.算法思想生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

消费者线程从缓冲区中获得物品,然后释放缓冲区。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

2.流程图3.程序代码#include<windows.h>#include<iostream.h>#include<fstream.h>#include<string.h>#include<conio.h>//声明所需变量intin=0;intout=0;HANDLEh_Thread[20];//线程数组HANDLEempty_Semaphore;//表示空缓冲区的信号量HANDLEfull_Semaphore;//表示空缓冲区的信号量HANDLEmutex;structdata{intID;//序号chartype;//类型,是生产者还是消费者,porcdoubledelay;//线程延迟的时间,对应生产者生产产品的时间或消费者消费产品的时间};dataThreadInfo[20];//线程信息数组intlength;//线程信息数组中实际的线程个数voidProduce(void*p);//生产者进程voidConsume(void*p);//消费者进程voidinput(void);intmain(void){input();//初始化临界区对象//InitializeCriticalSection(&PC_Critical);empty_Semaphore=CreateSemaphore(NULL,10,10,NULL);full_Semaphore=CreateSemaphore(NULL,0,10,NULL);mutex=::CreateMutex(NULL,FALSE,NULL);cout<<"下面生产者和消费者开始工作!!"<<endl;cout<<endl;//创建生产者和消费者线程for(inti=0;i{if(ThreadInfo[i].type=='p')h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),&(ThreadInfo[i]),0,NULL);elseif(ThreadInfo[i].type=='c')h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume),&(ThreadInfo[i]),0,NULL);}//主程序等待各个线程的动作结束WaitForMultipleObjects(length,h_Thread,TRUE,-1);cout<<endl;::Sleep(100);cout<<"所有的生产者和消费者都完成了它们的工作!!"<<endl<<endl;return0;}//*****************************************************************************************//生产者进程//******************************************************************************************voidProduce(void*p){//局部变量声明intmy_id;doublemy_delay;//从线程信息数组中获得信息my_id=((data*)(p))->ID;my_delay=((data*)(p))->delay;//开始请求生产WaitForSingleObject(empty_Semaphore,-1);::WaitForSingleObject(mutex,-1);//EnterCriticalSection(&PC_Critical);cout<<"生产者"<<my_id<<"发出生产请求。"<<endl;cout<<endl;cout<<"生产者"<<my_id<<"生产......"<<endl;in=(in+1);Sleep(my_delay*10);cout<<"生产者"<<my_id<<"完成了生产。"<<endl<<endl;//LeaveCriticalSection(&PC_Critical);ReleaseSemaphore(full_Semaphore,1,NULL);::ReleaseMutex(mutex);}//*****************************************************************************************//消费者进程//******************************************************************************************voidConsume(void*p){//局部变量声明intmy_id;doublemy_delay;//从线程信息数组中获得信息my_id=((data*)(p))->ID;my_delay=((data*)(p))->delay;//开始请求消费WaitForSingleObject(full_Semaphore,-1);::WaitForSingleObject(mutex,-1);//EnterCriticalSection(&PC_Critical);cout<<"消费者"<<my_id<<"发出消费请求。"<<endl;cout<<endl;cout<<"消费者"<<my_id<<"消费......"<<endl;out=(out+1);Sleep(my_delay*10);cout<<"消费者"<<my_id<<"完成了消费。"<<endl<<endl;//LeaveCriticalSection(&PC_Critical)ReleaseSemaphore(empty_Semaphore,1,NULL);::ReleaseMutex(mutex)}//*****************************************************************************************//输入进程信息的函数//******************************************************************************************voidinput(void){//定义局部变量intid;charch;doubletime;intk=0;cout<<"********请输入线程信息:"<<endl;cout<<"********线程ID;"<<endl;cout<<"********线程的类型(生产者线程,还是消费者线程,p代表生产者,c代表消费者);"<<endl;cout<<"********线程延迟时间。"<<endl;cout<<"********线程ID为0时结束线程信息的输入!!"<<endl<<endl;while(id!=0){cout<<"pleaseinputathreadID."<<endl;cin>>id;ThreadInfo[k].ID=id;if(id==0)break;cout<<"pleaseinputathreadtype."<<endl;cin>>ch;ThreadInfo[k].type=ch;cout<<"pleaseinputathreaddelaytime:"<<endl;cin>>time;ThreadInfo[k].delay=time;k++;}length=k;cout<<endl<<"您输入的线程信息为:"<<endl;for(intj=0;j{cout<<"thread"<<ThreadInfo[j].ID<<""<<ThreadInfo[j].type<<""<<ThreadInfo[j].delay<<endl;}}实验及结果分析: 能够正确模拟生产者

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论