实验二多线程应用程序设计.docx

上传人:b****4 文档编号:3144540 上传时间:2022-11-18 格式:DOCX 页数:13 大小:392.27KB
下载 相关 举报
实验二多线程应用程序设计.docx_第1页
第1页 / 共13页
实验二多线程应用程序设计.docx_第2页
第2页 / 共13页
实验二多线程应用程序设计.docx_第3页
第3页 / 共13页
实验二多线程应用程序设计.docx_第4页
第4页 / 共13页
实验二多线程应用程序设计.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验二多线程应用程序设计.docx

《实验二多线程应用程序设计.docx》由会员分享,可在线阅读,更多相关《实验二多线程应用程序设计.docx(13页珍藏版)》请在冰豆网上搜索。

实验二多线程应用程序设计.docx

实验二多线程应用程序设计

成绩

信息与通信工程学院实验报告

课程名称:

嵌入式系统原理与应用

实验题目:

多线程应用程序设计指导教师:

班级:

学号:

学生姓名:

一、

实验目的和任务

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模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1