Linux实验报告 消费者与生产者 多线程Word文件下载.docx
- 文档编号:13065418
- 上传时间:2022-10-04
- 格式:DOCX
- 页数:7
- 大小:179.57KB
Linux实验报告 消费者与生产者 多线程Word文件下载.docx
《Linux实验报告 消费者与生产者 多线程Word文件下载.docx》由会员分享,可在线阅读,更多相关《Linux实验报告 消费者与生产者 多线程Word文件下载.docx(7页珍藏版)》请在冰豆网上搜索。
(2)详细记录程序调试及运行结果
实验要求
1.写出源程序,并编译运行
2.详细记录程序调试及运行结果
程序代码及运行结果
对于实验1#include<
stdio.h>
第3页共7页中南大学信息科学与工程学院
intmain(void)
{
printf("
HelloWorld!
"
);
return0;
}
调试:
gcc -c helloworld.c
gcc–o helloworld helloworld.o
对于实验2:
a)编写一个生产者-消费者程序组,要求同时支持多个生产者和消费者,生产者与消费者使用Message Queue或shared
Memory或者Pipe File机制进行通信
设计方案:
首先定义一个定长数组(数组中的元素有0和1组成),作为一个数据缓冲区。
然后定义一个函数test,用来检测数组中当前1的个数。
然后定义两个函数,一个名为生产者函数,用来往数组中添加1,一个名为消费者函数,用来取走数组中的1.然后用test函数检测数组中1的个数,并报告给用户,然后选择堵塞生产者还是消费者。
程序运行截图:
第4页共7页中南大学信息科学与工程学院
源代码:
#include<
inttest(intarray[])
inti=0;
while(array[i]==1)
i++;
returni;
main()
intarray[20],n,m,i,l;
生产者消费者问题\n\n\n"
请输入当前buffer的空间n(n<
20)\n"
scanf("
%d"
&
n);
for(i=0;
i<
n;
i++)array[i]=0;
请输入当前的资源数m(m<
m);
for(i=0;
m;
i++)array[i]=1;
l=test(array);
当前的空间为%d,已用空间为%d,可用空间为%d\n"
n,l,n-l);
请选择下列操作:
\n\n1.生产\n\n2.消费\n\n3.退出\n"
while
(1)
inta;
i);
if(i==1)
请输入要生产的数量a\n"
a);
for(i=m;
m+a;
i++)printf("
%2d"
array[i]);
printf("
\n"
m=m+a;
if(l>
n)
缓冲区已满,请阻塞生产者进程,并继续进行操作!
!
m=n;
l=n;
第5页共7页中南大学信息科学与工程学院
\n\n"
else
请继续选择操作\n\n"
elseif(i==2)
请输入要消费的数量a\n"
//printf("
%d\n"
m);
for(i=m-1;
i>
m-1-a;
i--)
array[i]=0;
if(i<
0)break;
//for(i=0;
l=test(array);
m=m-a;
if(l<
=0)
else
printf("
缓冲区已空,请阻塞消费者进程,并继续选择操作!
m=0;
l=0;
请继续选择操作\n"
break;
欢迎使用此演示系统,谢谢!
b)编写一个多线程程序(pthread),实现2线程同步互斥源代码:
第6页共7页中南大学信息科学与工程学院
#include<
#include<
pthread.h>
#defineBUFFER_SIZE16structprodcons
//缓冲区相关数据结构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(&
notempty,NULL);
notfull,NULL);
readpos=0;
writepos=0;
voidput(structprodcons*b,intdata)
pthread_mutex_lock(&
lock);
if((b->
writepos+1)%BUFFER_SIZE==b->
readpos)
pthread_cond_wait(&
notfull,&
buffer[b->
writepos]=data;
b->
writepos++;
if(b->
writepos>
=BUFFER_SIZE)b->
pthread_cond_signal(&
notempty);
pthread_mutex_unlock(&
intget(structprodcons*b)
intdata;
pthread_mutex_lock(&
if(b->
writepos==b->
notempty,&
data=b->
readpos];
第7页共7页中南大学信息科学与工程学院
readpos++;
readpos>
notfull);
returndata;
#defineOVER(-1)structprodconsbuffer;
void*producer(void*data)
intn;
for(n=0;
n<
10000;
n++) {
%d--->
n);
put(&
buffer,n);
}put(&
buffer,OVER);
returnNULL;
void*consumer(void*data)
intd;
while
(1)
d=get(&
buffer);
if(d==OVER)
--->
%d\n"
d);
returnNULL;
pthread_tth_a,th_b;
void*retval;
init(&
pthread_create(&
th_a,NULL,producer,0);
pthread_create(&
th_b,NULL,consumer,0);
pthread_join(th_a,&
retval);
pthread_join(th_b,&
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux实验报告 消费者与生产者 多线程 Linux 实验 报告 消费者 生产者