生产者与消费者算法的实现_第1页
生产者与消费者算法的实现_第2页
生产者与消费者算法的实现_第3页
生产者与消费者算法的实现_第4页
生产者与消费者算法的实现_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、实验六信号量l=J厦门大学软件学院吴清强实验目的加强对进程概念的理解。进一步了解并发执行的实质。分析进程争用资源的现象,学习解决进程互斥的方法 了解Linux系统中进程通信的基本原理二.相关知识进程的概念。进程与程序的区别。进程并发执行的概念。进程互斥的概念 进程通信的基本原理三.实验内容使用信号量实现有限缓冲区的生产者和消费者问题使用信号量实现读进程具有优先权的读者和写者问题实验环境 PC + Linux Red Hat 操作系统 GCC1.使用信号量实现有限缓冲区的生产者和消费者问题.程序流程图生产者进程生产流程图消费者进程消费流程图源代码1、生产者生产进程函数DWORD WINAPI P

2、roducer(LPVOID lpParameter)(while(true)(for(int j=0;j4;j+)(if(bufferj=0)(/找 到空缓冲区if(lockj=false)/同步锁为false,可以进行操作 lockj=true;/加锁,防止其他线程操作此缓冲区 if(bufferj1)/限艮定一个缓冲区只能存放一个资源+bufferj;/模拟生产资源cout”生产一个资源,放入缓冲区”j中”endl;lockj=false;/解锁break;/ 次生产一个if(j=3)cout找不到空缓冲区,等待中。endl;Sleep(2000);return 0;2、消费者消费进程函

3、数DWORD WINAPI Customer(LPVOID lpParameter)while(true)for(int n=0;n=1)-buffern;/模拟消费资源cout消费一个资源,从缓冲区n中取出endl;lockn=false;/解 锁break;/一 次生产一个if(n=3)cout”找不到满缓冲区,等待中。:ohrnr 0 2 1nrraqo 0 3qn0 区时区区区。雕区区区震。区区噩区 冲区区区:区区区区*贵区区冲 缓:.入美入入入入入入区区区区9 原源源源源-00-源源源源源源源源-00-源源源源源ke一 一一一产费产产产不不费费产产产费费费费不不产产费费产 _生消生生

4、生生生生生生碧生一一 一一一 一引一一一一3, *C: Progra FilesMicrosoft Visual StudioByPro jectsDebug.1、一个生产者生产,一个消费者消费:需二毯I:牖搬客出1、两个生产者连续生产,两个消费者连续消费:产产I4 02 护ff口口区区 ESHff出出取职2、多个生产者于多个消费者进行生产消费操作泉原原泉原LB&B扉原原原原.国 1 ,JP .Jrr 7t . 1V 1. HIP .Jlr ./PI ?lr Jlrl 个个个个空空个个个!1/! -一一一 产产费产产产不不费费产出出出出出&-B-聚口 口口 E0E1W区区区出出取取翠取取-2-

5、2 0 。 。就区区区0 2 3 I 区ffffff口口 区区护ffff区区区IE 入入入入2.使用信号量实现读进程具有优先权的读者和写者问题一、程序流程图二、 源代码#include#include#include#include#include#includeint critical;int createSem()/创建信 号量return semget(key_t)1000,2,IPC_CREATI0600);/the second parameter in semget is the number of signal we will createvoid initSignal(int

6、semid,int index,int value)/初 始化信号量semctl(semid,index,SETVAL,value);void make_critical () 创建缓冲区critical=mmap(NULL,10*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED| MAP_ANONYMOUS,-1,0);critical0=-1;/the value of the critical file is init as -1 critical1=0;/the reader count is 0;void semWait(int semid,in

7、t index)/判断当前进程是否进入缓冲区,被占用 就挂起struct sembuf sem_buf;sem_buf.sem_num=index;sem_buf.sem_op=-1;sem_buf.sem_flg=SEM_UNDO;semop(semid,&sem_buf,1);void semSignal(int semid,int index)/唤醒一个在阻塞队列中等待的进程struct sembuf sem_buf;sem_buf.sem_num=index;sem_buf.sem_op=1;sem_buf.sem_flg=SEM_UNDO;semop(semid,&sem_buf,1

8、);为了让读者优先,当读者获得控制权时,写者进程必须挂起;当第一 个读者进程到来(等到写者进程释放控制权)时,第一个读者进程获得 优先权,接着其他读者进程不再等待,同时执行。/故而用critical1记录读者进程读到的内容,用semid0控制读者或写 者进程,用semid1更新critical1的值void reader(int semid)while(1)semWait(semid,1);critical1+;if(critical1=1)semWait(semid,0);semSignal(semid,1);/correctly update the reader countprintf(

9、reader: read value %dn”,critical0);semWait(semid,1);critical1-;/have read it readers have decreased update it correctlyif(critical1=0)/no readerssemSignal(semid,0);/free the ownership of readerssemSignal(semid,1);void writer(int semid)while(1)semWait(semid,0);printf(input:);scanf(%d,&critical0);prin

10、tf(writer: write after update value is %dn,critical0);semSignal(semid,0);int main()int semid=createSem();initSignal(semid,0,1);/初始化控制写者信号量WinitSignal(semid,1,1);/初始化控制读者信号量R/the critical number is init as -1 the writer will update itmake_critical();/create critical regionpid_t child=fork();if(child=

11、0)reader(semid);elsewriter(semid);return 0;实验结果:文件(E)德网 查看M 兴端标密担荷助roatl ocal hos t、户 gee o Read liidWrite oirt Read And ri t e,crootl calhusl 1 . ./Read ndri Lt. utreader: read value -1input 21234writer: wri te after update a1ue is 1234re&dcr: read Baltic 1.2Mreader: read i-atue 1234input:234writer

12、: ri te after update talue is 234reader? rcM 234input346vrri lorvri ic after update taiuc i s 346reader: read value 346input:1336writer wri te after up*Jate alue is 1356readers rad inluc 135*6input:2356wri ters write after update valoc Is 2356re&Jer: re&d value 235tiinpulN57wriLer wrile after update

13、 value is 457reader: read va1w J57input8734writer: ffri te after update a1ue i s 8734reader: read, value 8734input: 12wri ter: wri te &f les update xalue i s 12reader: read value 12inpuL:2Swriter: wri te after update value is 25readers read value 25input:547wri Lcrs till after Lipdutt 气i h j47reader

14、: read vaiue 547input:|五、实验总结.这次多线程的操作系统实验,使我对线程的概念 以及多线程程序中线程间的运行有了更深的认识,同 时也让我的编程能力得到了一定的提高。这次做的用多线程实现生产者与消费者模型的实验, 由于我的编程能力基础比较差,对线程也是一无所知, 所以一开始觉得无从下手,但幸好老师给了充足的时 间,我通过看网上找的视频资料以及请教同学才渐渐地有了一点概念,然后我试着从网上下了一些多线程 的程序分析里面的语句,基本弄懂了多线程的原理附:#include iostream.h#include windows.h#include stdio.hbool lock

15、4=false,false,false,false;/四把锁,分别对四个缓冲区进行同步 int buffer4=0,0,0,0;/缓冲区,表示资源的个数void display()coutendl;cout缓冲区0123endl;for(int i=0;i4;i+)cout bufferi;coutendl; DWORD WINAPI Producer(LPVOID lpParameter) while(true)for(int j=0;j4;j+)if(bufferj=0)/ 找到空缓冲区if(lockj=false)/同步锁为false,可以进行操作 lockj=true;/加锁,防止其他

16、线程操作此缓冲区 if(bufferj1)/限定一个缓冲区只能存放一个资源 +bufferj;/模拟生产资源cout生产一个资源,放入缓冲区j中”vvendl; lockj=false;/解 锁break;/ 一次生产一个if(j=3)cout找不到空缓冲区,等待中。endl;Sleep(2000);return 0;DWORD WINAPI Customer(LPVOID IpParameter)while(true)(for(int n=0;n=1)-buffern;/模拟消费资源cout”消费一个资源,从缓冲区”n”中取出”endl;lockn=false;/ 解锁 break;/ 一次生产一个if(n=3)cout找不到满缓冲区,等待中。endl;Sleep(2000);return 0;int main(int argc,char* argv)display();HANDLE handle3;DWORD dw1,dw2,dw3,dw4,dw0;handle0=CreateThread(NULL,0,Pro

温馨提示

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

评论

0/150

提交评论