2嵌入式系统设计实验二(多线程)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。
⏹下面我们来介绍有关条件变量的内容。使用互斥锁来可实现线程间数据的共享