实验二多线程应用程序设计_第1页
实验二多线程应用程序设计_第2页
实验二多线程应用程序设计_第3页
实验二多线程应用程序设计_第4页
实验二多线程应用程序设计_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

..成绩信息与通信工程学院实验报告课程名称:嵌入式系统原理与应用实验题目:多线程应用程序设计指导教师:班级:学号:学生:实验目的和任务掌握VI编译环境。掌握GCC编译命令。掌握多个文件共同编译方法。掌握GDB调试命令。学习实验设备实验容及原理实验步骤或程序流程Gcc编译实验编写实验代码:图3.1实验主程序图3.2实验子程序编写Makefile文件:图3.3Makefile文件Make执行Makefile文件,生成可执行程序并运行:图3.4执行Gdb调试运行:图3.5gdb调试显示代码图3.6gdb调试断点运行图3.7gdb调试逐步运行多线程程序设计:对实验代码进展gcc编译:图3.7gcc编译生成可执行文件运行结果:图3.8程序运行结果实验数据及程序代码Gcc编译实验:主程序:#include"stdio.h"#include"my2.h"intmain(){ printf("hello.Linuxworld.Iam1405014232zzm\n"); my2();}实验子程序:#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);}.h头文件:#ifndef_MY2_H#define_MY2_Hintmain();voidmy2();#endifmakefile执行文件:zzmgo:my2.omy1.o gcc-ozzmgomy2.omy1.omy1.o:my1.cmy2.h gcc-cmy1.cmy2.o:my2.cmy2.h gcc-cmy2.cclean:rm-rfmy1.omy2.ozzmgo多线程程序设计:..#include<stdio.h>#include<stdlib.h>#include<time.h>#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;}..实验数据分析及处理实验构造流程图:本实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线程和消费者线程。生产者线程不断顺序地将0到1000的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。流程图如下图:图6.1生产者-消费者实验源代码构造流程图主要函数分析:下面我们来看一下,生产者写入缓冲区和消费者从缓冲区读数的具体流程,生产者首先要获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等那么进入等待状态,等候条件变量notfull;如果不等那么向缓冲区中写一个整数,并且设置条件变量为notempty,最后释放互斥锁。消费者线程与生产者线程类似,这里就不再过多介绍了。流程图如下:图6.2生产消费流程图主要的多线程API:在本程序的代码量的使用了线程函数,如pthread_cond_signal、pthread_mutex_init、pthread_mutex_lock等等,这些函数的作用是什么,在哪里定义的,我们将在下面的容中为其中比拟重要的函数做一些详细的说明。pthread_create线程创立函数:intpthread_create(pthread_t*thread_id,__constpthread_attr_t*__attr,void*(*__start_routine)(void*),void*__restrict__arg)线程创立函数第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。当创立线程成功时,函数返回0,假设不为0那么说明创立线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创立新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创立线程成功后,新创立的线程那么运行参数三和参数四确定的函数,原来的线程那么继续运行下一行代码。pthread_join函数用来等待一个线程的完毕。函数原型为:intpthread_join(pthread_t__th,void**__thread_return)第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程完毕为止,当函数返回时,被等待线程的资源被收回。pthread_exit函数:一个线程的完毕有两种途径,一种是象我们上面的例子一样,函数完毕了,调用它的线程也就完毕了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:voidpthread_exit(void*__retval)唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。最后要说明的是,一个线程不能被多个线程等待,否那么第一个接收到信号的线程成功返回,其余调用pthread_join的线程那么返回错误代码ESRCH。下面我们来介绍有关条件变量的容。使用互斥锁来可实现线程间数据的共享和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论