实验二多线程应用程序设计.docx
- 文档编号:3144540
- 上传时间:2022-11-18
- 格式:DOCX
- 页数:13
- 大小:392.27KB
实验二多线程应用程序设计.docx
《实验二多线程应用程序设计.docx》由会员分享,可在线阅读,更多相关《实验二多线程应用程序设计.docx(13页珍藏版)》请在冰豆网上搜索。
实验二多线程应用程序设计
成绩
信息与通信工程学院实验报告
课程名称:
嵌入式系统原理与应用
实验题目:
多线程应用程序设计指导教师:
班级:
学号:
学生姓名:
一、
实验目的和任务
1.掌握VI编译环境。
2.掌握GCC编译命令。
3.掌握多个文件共同编译方法。
4.掌握GDB调试命令。
5.了解多线程程序设计的基本原理。
6.学习pthread库函数的使用。
二、实验设备
7.硬件:
PC机
8.软件:
LINUX操作系统、虚拟机
三、实验内容及原理
1.在VI编辑器里编写两个文件(其中一个为主程序,实现显示“hello,linuxworld,Iam1405014XXXXXX”,,一个为子程序,实现1~n的乘法),为其书写头文件,共同编译为可执行文件,执行,观察运行结果。
学习书写MAKEFILE文件,编译,执行,观察结果。
利用GCC编译(加参数-g)为可执行文件,利用GDB调试,学习GDB调试命令。
2.编写多线程程序设计。
编译并运行,观察结果。
(可参照课件或实验指导书)
四、实验步骤或程序流程
1.Gcc编译实验
1)编写实验代码:
图3.1实验主程序
图3.2实验子程序
2)编写Makefile文件:
图3.3Makefile文件
3)Make执行Makefile文件,生成可执行程序并运行:
图3.4执行
4)Gdb调试运行:
图3.5gdb调试显示代码
图3.6gdb调试断点运行
图3.7gdb调试逐步运行
2.多线程程序设计:
1)对实验代码进行gcc编译:
图3.7gcc编译生成可执行文件
2)运行结果:
图3.8程序运行结果
五、实验数据及程序代码
1.Gcc编译实验:
1)主程序:
#include"stdio.h"
#include"my2.h"
intmain()
{
printf("hello.Linuxworld.Iam1405014232zzm\n");
my2();
}
2)实验子程序:
#include"my2.h"
#include"stdio.h"
voidmy2()
{
inti=1;
floats=1
intN;
printf("Pleaseinputn:
\n");
scanf("%d",&N);
for(i,i<=n,i++)
s*=i;
printf("result:
");
printf("%f",s);
}
3).h头文件:
#ifndef_MY2_H
#define_MY2_H
intmain();
voidmy2();
#endif
4)makefile执行文件:
zzmgo:
my2.omy1.o
gcc-ozzmgomy2.omy1.o
my1.o:
my1.cmy2.h
gcc-cmy1.c
my2.o:
my2.cmy2.h
gcc-cmy2.c
clean:
rm-rfmy1.omy2.ozzmgo
1.多线程程序设计:
#include
#include
#include
#include"pthread.h"
#defineBUFFER_SIZE16
/*Circularbufferofintegers.*/
structprodcons{
intbuffer[BUFFER_SIZE];
/*theactualdata*/
pthread_mutex_tlock;
/*mutexensuringexclusiveaccesstobuffer*/
intreadpos,writepos;
/*positionsforreadingandwriting*/
pthread_cond_tnotempty;
/*signaledwhenbufferisnotempty*/
pthread_cond_tnotfull;
/*signaledwhenbufferisnotfull*/
};
/*--------------------------------------------------------*/
/*Initializeabuffer*/
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;
}
/*--------------------------------------------------------*/
/*Storeanintegerinthebuffer*/
voidput(structprodcons*b,intdata)
{
pthread_mutex_lock(&b->lock);
/*Waituntilbufferisnotfull*/
while((b->writepos+1)%BUFFER_SIZE==b->readpos){
printf("waitfornotfull\n");
pthread_cond_wait(&b->notfull,&b->lock);
}
/*Writethedataandadvancewritepointer*/
b->buffer[b->writepos]=data;
b->writepos++;
if(b->writepos>=BUFFER_SIZE)b->writepos=0;
/*Signalthatthebufferisnownotempty*/
pthread_cond_signal(&b->notempty);
pthread_mutex_unlock(&b->lock);
}
/*--------------------------------------------------------*/
/*Readandremoveanintegerfromthebuffer*/
intget(structprodcons*b)
{
intdata;
pthread_mutex_lock(&b->lock);
/*Waituntilbufferisnotempty*/
while(b->writepos==b->readpos){
printf("waitfornotempty\n");
pthread_cond_wait(&b->notempty,&b->lock);
}
/*Readthedataandadvancereadpointer*/
data=b->buffer[b->readpos];
b->readpos++;
if(b->readpos>=BUFFER_SIZE)b->readpos=0;
/*Signalthatthebufferisnownotfull*/
pthread_cond_signal(&b->notfull);
pthread_mutex_unlock(&b->lock);
returndata;
}
/*--------------------------------------------------------*/
#defineOVER(-1)
structprodconsbuffer;
/*--------------------------------------------------------*/
void*producer(void*data)
{
intn;
for(n=0;n<1000;n++){
printf("put-->%d\n",n);
put(&buffer,n);
}
put(&buffer,OVER);
printf("producerstopped!
\n");
returnNULL;
}
/*--------------------------------------------------------*/
void*consumer(void*data)
{
intd;
while
(1){
d=get(&buffer);
if(d==OVER)break;
printf("%d-->get\n",d);
}
printf("consumerstopped!
\n");
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);
/*Waituntilproducerandconsumerfinish.
*/
pthread_join(th_a,&retval);
pthread_join(th_b,&retval);
return0;
}
六、实验数据分析及处理
1.实验结构流程图:
本实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。
生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。
流程图如图所示:
图6.1生产者-消费者实验源代码结构流程图
2.主要函数分析:
下面我们来看一下,生产者写入缓冲区和消费者从缓冲区读数的具体流程,生产者首先要获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull;如果不等则向缓冲区中写一个整数,并且设置条件变量为notempty,最后释放互斥锁。
消费者线程与生产者线程类似,这里就不再过多介绍了。
流程图如下:
图6.2生产消费流程图
3.主要的多线程API:
在本程序的代码中大量的使用了线程函数,如pthread_cond_signal、pthread_mutex_init、pthread_mutex_lock等等,这些函数的作用是什么,在哪里定义的,我们将在下面的内容中为其中比较重要的函数做一些详细的说明。
1)pthread_create线程创建函数:
in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 多线程 应用 程序设计