2嵌入式系统设计实验二(多线程)

  • 格式:doc
  • 大小:313.00 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

注意实验二是在实验一的基础上完成其内容,具体环境配置见实验一

目录

实验二多线程应用程序设计 (2)

2.1实验目的 (2)

2.2、实验内容 (2)

2.3、预备知识 (2)

2.4、实验设备及工具 (2)

2.5、实验原理及代码分析 (3)

2.6、实验步骤 (11)

2.7、思考题 (13)

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

2.1实验目的

⏹了解多线程程序设计的基本原理。

⏹学习pthread库函数的使用。

2.2、实验内容

⏹读懂pthread.c的源代码,熟悉几个重要的pthread库函数的使用。掌握共享

锁和信号量的使用方法。

⏹进入/root/share/exp/basic/02_pthread目录,运行make 产生pthread程序,

使用NFS方式连接开发主机进行运行实验。

2.3、预备知识

⏹有C语言基础

⏹掌握在Linux下常用编辑器的使用

⏹掌握Makefile 的编写和使用

⏹掌握Linux下的程序编译与交叉编译过程

2.4、实验设备及工具

⏹硬件:UP-TECH S2410/P270 DVP嵌入式实验平台,PC机Pentium 500以上, 硬

盘40G以上,内存大于128M。

⏹软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX开发环境

2.5、实验原理及代码分析

1.多线程程序的优缺点

⏹多线程程序作为一种多任务、并发的工作方式,有以下的优点:

⏹1)提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很

长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操

作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线

程,可以避免这种尴尬的情况。

⏹2)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不

同的线程运行于不同的CPU上。

⏹3)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个

独立或半独立的运行部分,这样的程序会利于理解和修改。

⏹Libc中的pthread库提供了大量的API函数,为用户编写应用程序提供支持。2.实验源代码与结构流程图

⏹本实验为著名的生产者-消费者问题模型的实现,主程序中分别启动生产者线

程和消费者线程。生产者线程不断顺序地将0到1000的数字写入共享的循环

缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。流程图如图

2.2.1所示:

图2.1生产者-消费者实验源代码结构流程图

本实验具体代码如下:

3.主要函数分析:

下面我们来看一下,生产者写入缓冲区和消费者从缓冲区读数的具体流程,生产者首先要获得互斥锁,并且判断写指针+1后是否等于读指针,如果相等则

进入等待状态,等候条件变量notfull;如果不等则向缓冲区中写一个整数,

并且设置条件变量为notempty,最后释放互斥锁。消费者线程与生产者线程

类似,这里就不再过多介绍了。流程图如下:

s

图2.2 生产消费流程图

生产者写入共享的循环缓冲区函数PUT

消费者读取共享的循环缓冲区函数GET

4.主要的多线程API

⏹在本程序的代码中大量的使用了线程函数,如pthread_cond_signal、

pthread_mutex_init、pthread_mutex_lock等等,这些函数的作用是什么,

在哪里定义的,我们将在下面的内容中为大家做一个简单的介绍,并且为其中

比较重要的函数做一些详细的说明。

⏹PTHREAD库中还有大量的API函数,用户可以参考其他相关书籍。下面我们对

几个比较重要的函数做一下详细的说明:

⏹pthread_create线程创建函数

⏹线程创建函数第一个参数为指向线程标识符的指针,第二个参数用来设置线程

属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。

第二个参数我们也设为空指针,这样将生成默认属性的线程。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN 和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

⏹第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可

以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。

pthread_exit函数

⏹一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调

用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:

⏹唯一的参数是函数的返回代码,只要pthread_join中的第二个参数

thread_return不是NULL,这个值将被传递给thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。

⏹下面我们来介绍有关条件变量的内容。使用互斥锁来可实现线程间数据的共享