如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
嵌入式系统程序设计大连理工大学软件学院嵌入式系统工程系赖晓晨POSIX线程编程概述多线程程序设计方法线程同步线程属性线程取消其他线程函数一、POSIX线程概述定义:一个程序中的多个执行路线叫做线程,线程是一个进程内部的控制序列。所有的进程都至少有一个执行线程(初始线程)。初始线程随进程的创建而创建,其他线程则需要通过显式的函数调用来创建。进程vs线程当进程执行fork()调用时,将创建该进程的一份完整拷贝,该进程拥有自己的PID和变量,独立调度,执行(几乎)独立于父进程。新线程拥有自己独立的栈(eg.局部变量),但与创建者共享全局变量、文件描述符、信号句柄、当前目录状态。线程历史Linux系统在1996年第一次支持线程:LinuxThread函数库。POSIX1003.1c规范对线程进行了标准化。线程的发展:新一代线程:NGPT(newgenerationPOSIXThread)本地化POSIX线程库:NPTL(nativePOSIXThreadLibrary)线程历史(续)2002年,NGPT宣布解散,NPTL成为linux线程的新标准。第一个主流NPTL版本出现在RedHadLinux9操作系统。线程的优点程序呈现出同时做多件事情的特性(并发性)。某些(包含输入、计算、输出的)应用程序,非常适合使用多线程。线程切换的代价比进程切换小的多。线程的缺点变量共享和时序设计需要非常仔细,很容易出现错误。调试困难。在单处理器系统中速度不一定能够提高。线程的状态就绪态:线程能够运行,正在等待处理机资源。可能刚启动,或被其他线程抢占处理器,或从阻塞态恢复。运行态:正在运行。在多处理机系统中,可能有多个线程处于运行态。阻塞态:线程由于等待某些条件而无法运行,例如IO、加锁互斥量或其他条件。终止态:线程从起始函数返回、或调用pthread_exit()函数、或被取消。线程的状态迁移图条件被满足就绪态阻塞态被抢占创建被调度等待资源运行态完成或者被取消终止态二、多线程程序设计方法线程支持:线程由一套完整的函数库支持,其中绝大部分函数以“pthread_”开头。为了使用这些库函数,代码中必须定义_REENTRANT宏。程序中要包含头文件pthread.h。编译时需要使用-lpthread选项。可重入性问题线程编程需要使用可重入的代码,即可以被不同线程调用多次而仍然能正常工作的代码。errno被多个线程共享,该变量很容易被不同线程修改,从而引起错误。代码中的静态变量涉及重入性问题,局部变量是可重入的。宏_REENTRANT的功能对部分函数重新定义其可重入的安全版本。stdio.h中以宏的形式出现的一些函数将变为可重入函数。在errno.h中定义的变量errno将成为一个函数调用,能够以一种安全的多线程方式来获取真正的errno值。该宏必须定义在程序所有头文件包含之前实现线程的函数创建新线程:pthread_creat终止线程:pthread_exit合并线程:pthread_join创建新线程#include<pthread.h>intpthread_create(pthread_t*thread,//返回指向线程标识符的指针pthread_attr*attr,//设置线程属性void*(*func)(void*),//新线程将启动的函数的地址void*arg//传递给新线程启动函数的参数);函数执行成功返回0,失败返回错误码。执行成功后,新线程将从设定的函数处开始执行,原线程则继续执行。退出线程#include<pthread.h>voidpthread_exit(void*ret)终止调用此函数的线程,并返回一个指向某对象的指针(ret)。注意,不能返回指向局部变量的指针。合并线程#include<pthread.h>intpthread_join(pthread_t*thread,void**ret);等价于进程中用于收集子进程的wait()函数,thread是要等待的线程(即通过pthread_creat函数返回的线程标识符),ret是一个二级指针,它指向一个指针,后者指向线程的返回值。函数执行成功时返回0,失败时返回错误码。#include<stdio.h>#include<unistd.h>#include<stdlib.h>#i