Linux实验报告消费者与生产者多线程.docx
- 文档编号:23439429
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:11
- 大小:369.49KB
Linux实验报告消费者与生产者多线程.docx
《Linux实验报告消费者与生产者多线程.docx》由会员分享,可在线阅读,更多相关《Linux实验报告消费者与生产者多线程.docx(11页珍藏版)》请在冰豆网上搜索。
Linux实验报告消费者与生产者多线程
编号
LINUX实验报告
题目linux高级程序设计
学生姓名
指导教师
学院
专业班级
学号
完成时刻
实验3Linux高级程序设计
一、实验目的
(1)了解Linux操作系统下应用程序开发流程
(2)把握gun工具链的利用
(3)了解Linux高级编程技术(例如IPC机制、系统挪用等)
二、实验内容
(1)编写一个简单的C语言程序,编写Makefile文件。
了解编译进程,并用gdb进行调试。
(2)以下任选其一:
1.编写一个生产者-消费者程序组,要求同时支持多个生产者和消费者,生产者与消费者利用MessageQueue或sharedMemory或PipeFile机制进行通信
2.编写一个多线程程序(pthread),实现2线程同步互斥
3、实验要求
(1)写出源程序,并编译运行
(2)详细记录程序调试及运行结果
实验要求
1.写出源程序,并编译运行
2.详细记录程序调试及运行结果
程序代码及运行结果
关于实验1
#include<>
intmain(void)
{
printf("HelloWorld!
");
return0;
}
调试:
gcc-c
gcc–ohelloworld
关于实验2:
a)编写一个生产者-消费者程序组,要求同时支持多个生产者和消费者,生产者与消费者利用MessageQueue或sharedMemory或PipeFile机制进行通信
设计方案:
第一概念一个定长数组(数组中的元素有0和1组成),作为一个数据缓冲区。
然后概念一个函数test,用来检测数组中当前1的个数。
然后概念两个函数,一个名为生产者函数,用来往数组中添加1,一个名为消费者函数,用来取走数组中的1.然后用test函数检测数组中1的个数,并报告给用户,然后选择堵塞生产者仍是消费者。
程序运行截图:
源代码:
#include<>
inttest(intarray[])
{
inti=0;
while(array[i]==1)
{
i++;
}
returni;
}
main()
{
intarray[20],n,m,i,l;
printf("生产者消费者问题\n\n\n");
printf("请输入当前buffer的空间n(n<20)\n");
scanf("%d",&n);
for(i=0;i printf("请输入当前的资源数m(m<20)\n"); scanf("%d",&m); for(i=0;i l=test(array); printf("当前的空间为%d,已用空间为%d,可用空间为%d\n",n,l,n-l); printf("请选择以下操作: \n\n1.生产\n\n2.消费\n\n3.退出\n"); while (1) { inta; scanf("%d",&i); if(i==1) { printf("请输入要生产的数量a\n"); scanf("%d",&a); for(i=m;i for(i=0;i printf("\n"); l=test(array); m=m+a; if(l>n) { printf("缓冲区已满,请阻塞生产者进程,并继续进行操作! ! \n"); m=n; l=n; } else { printf("当前的空间为%d,已用空间为%d,可用空间为%d\n",n,l,n-l);printf("\n\n"); printf("请继续选择操作\n\n"); } } elseif(i==2) { printf("请输入要消费的数量a\n");//printf("%d\n",m); scanf("%d",&a); for(i=m-1;i>m-1-a;i--) { array[i]=0; if(i<0)break; } //for(i=0;i l=test(array); m=m-a; if(l<=0) { printf("缓冲区已空,请阻塞消费者进程,并继续选择操作! ! \n"); m=0; l=0; } else { printf("当前的空间为%d,已用空间为%d,可用空间为%d\n",n,l,n-l);printf("\n\n"); printf("请继续选择操作\n"); } } else break; } printf("欢迎利用此演示系统,谢谢! ! \n"); } b)编写一个多线程程序(pthread),实现2线程同步互斥 源代码: #include<> #include<> #defineBUFFER_SIZE16 structprodcons { //缓冲区相关数据结构 intbuffer[BUFFER_SIZE]; pthread_mutex_tlock; intreadpos,writepos; pthread_cond_tnotempty; pthread_cond_tnotfull; }; voidinit(structprodcons*b){ pthread_mutex_init(&b->lock,NULL); pthread_cond_init(&b->notempty,NULL); pthread_cond_init(&b->notfull,NULL); b->readpos=0; b->writepos=0; } voidput(structprodcons*b,intdata) { pthread_mutex_lock(&b->lock); if((b->writepos+1)%BUFFER_SIZE==b->readpos) { pthread_cond_wait(&b->notfull,&b->lock); } b->buffer[b->writepos]=data; b->writepos++; if(b->writepos>=BUFFER_SIZE) b->writepos=0; pthread_cond_signal(&b->notempty); pthread_mutex_unlock(&b->lock); } intget(structprodcons*b) { intdata; pthread_mutex_lock(&b->lock); if(b->writepos==b->readpos) { pthread_cond_wait(&b->notempty,&b->lock); } data=b->buffer[b->readpos]; b->readpos++; if(b->readpos>=BUFFER_SIZE) b->readpos=0; pthread_cond_signal(&b->notfull); pthread_mutex_unlock(&b->lock); returndata; } #defineOVER(-1) structprodconsbuffer; void*producer(void*data) { intn; for(n=0;n<10000;n++){ printf("%d--->\n",n); put(&buffer,n); }put(&buffer,OVER); returnNULL; } void*consumer(void*data) { intd; while (1) { d=get(&buffer); if(d==OVER) break; printf("--->%d\n",d); } returnNULL; } intmain(void) { pthread_tth_a,th_b; void*retval; init(&buffer); pthread_create(&th_a,NULL,producer,0); pthread_create(&th_b,NULL,consumer,0); pthread_join(th_a,&retval); pthread_join(th_b,&retval); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 实验 报告 消费者 生产者 多线程