欢迎来到天天文库
浏览记录
ID:53327392
大小:30.50 KB
页数:6页
时间:2020-04-03
《生产者和消费者问题.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、班级姓名:学号:成绩:实验名称:生产者和消费者问题1.实验目的:“生产者消费者”问题是一个著名的同时性编程问题的集合。通过编写经典的“生产者消费者”问题的实验,读者可以进一步熟悉Linux中多线程编程,并且掌握用信号量处理线程间的同步互斥问题。2.实验内容:“生产者消费者”问题描述如下。有一个有限缓冲区和两个线程:生产者和消费者。他们分别把产品放入缓冲区和从缓冲区中拿走产品。当一个生产者在缓冲区满时必须等待,当一个消费者在缓冲区空时也必须等待。它们之间的关系如下图所示:这里要求用有名管道来模拟有限缓冲区,用信号量来解决生产者消费者问题中的同步和互斥问题。3.实验方法:(
2、1)使用信号量解决(2)思考使用条件变量解决4.实验过程(1)信号量的考虑这里使用3个信号量,其中两个信号量avail和full分别用于解决生产者和消费者线程之间的同步问题,mutex是用于这两个线程之间的互斥问题。其中avail初始化为N(有界缓冲区的空单元数),mutex初始化为1,full初始化为0。/*product.c*/#include#include#include#include#include#include#include3、phore.h>#include#defineFIFO"myfifo"#defineN5intlock_var;time_tend_time;charbuf_r[100];sem_tmutex,full,avail;intfd;voidpthread1(void*arg);voidpthread2(void*arg);intmain(intargc,char*argv[]){pthread_tid1,id2;pthread_tmon_th_id;intret;end_time=time(NULL)+30;/*创建有名管道*/if((mkfifo(FIF4、O,O_CREAT5、O_EXCL)<0)&&(errno!=EEXIST))printf("cannotcreatefifoserver");printf("Preparingforreadingbytes...");memset(buf_r,0,sizeof(buf_r));/*打开管道*/fd=open(FIFO,O_RDWR6、O_NONBLOCK,0);if(fd==-1){perror("open");exit(1);}/*初始化互斥信号量为1*/ret=sem_init(&mutex,0,1);/*初始化avail信号量为N*/ret=sem_init7、(&avail,0,N);/*初始化full信号量为0*/ret=sem_init(&full,0,0);if(ret!=0){perror("sem_init");}/*创建两个线程*/ret=pthread_create(&id1,NULL,(void*)productor,NULL);if(ret!=0)perror("pthreadcread1");ret=pthread_create(&id2,NULL,(void*)consumer,NULL);if(ret!=0)perror("pthreadcread2");pthread_join(id1,NULL);8、pthread_join(id2,NULL);exit(0);}/*生产者线程*/voidproductor(void*arg){inti,nwrite;while(time(NULL)9、"writehellototheFIFO");/*V操作信号量full和mutex*/sem_post(&full);sem_post(&mutex);sleep(1);}}/*消费者线程*/voidconsumer(void*arg){intnolock=0;intret,nread;while(time(NULL)
3、phore.h>#include#defineFIFO"myfifo"#defineN5intlock_var;time_tend_time;charbuf_r[100];sem_tmutex,full,avail;intfd;voidpthread1(void*arg);voidpthread2(void*arg);intmain(intargc,char*argv[]){pthread_tid1,id2;pthread_tmon_th_id;intret;end_time=time(NULL)+30;/*创建有名管道*/if((mkfifo(FIF
4、O,O_CREAT
5、O_EXCL)<0)&&(errno!=EEXIST))printf("cannotcreatefifoserver");printf("Preparingforreadingbytes...");memset(buf_r,0,sizeof(buf_r));/*打开管道*/fd=open(FIFO,O_RDWR
6、O_NONBLOCK,0);if(fd==-1){perror("open");exit(1);}/*初始化互斥信号量为1*/ret=sem_init(&mutex,0,1);/*初始化avail信号量为N*/ret=sem_init
7、(&avail,0,N);/*初始化full信号量为0*/ret=sem_init(&full,0,0);if(ret!=0){perror("sem_init");}/*创建两个线程*/ret=pthread_create(&id1,NULL,(void*)productor,NULL);if(ret!=0)perror("pthreadcread1");ret=pthread_create(&id2,NULL,(void*)consumer,NULL);if(ret!=0)perror("pthreadcread2");pthread_join(id1,NULL);
8、pthread_join(id2,NULL);exit(0);}/*生产者线程*/voidproductor(void*arg){inti,nwrite;while(time(NULL)9、"writehellototheFIFO");/*V操作信号量full和mutex*/sem_post(&full);sem_post(&mutex);sleep(1);}}/*消费者线程*/voidconsumer(void*arg){intnolock=0;intret,nread;while(time(NULL)
9、"writehellototheFIFO");/*V操作信号量full和mutex*/sem_post(&full);sem_post(&mutex);sleep(1);}}/*消费者线程*/voidconsumer(void*arg){intnolock=0;intret,nread;while(time(NULL)
此文档下载收益归作者所有