嵌入式操作系统:第9章 嵌入式Linux多线程开发

举报
资源描述
第第9 9章章 嵌入式嵌入式LinuxLinux多线程开发多线程开发本章教学目的及要求了解Linux的多线程概念掌握Linux多线程相关的API理解Linux多线程的通信机制及常用方法线程的概念线程的概念进程是系统中程序执行程序执行和资源分配资源分配的基本单位。每个进程都拥有自己的数据段数据段、代码段代码段和堆栈段堆栈段,这就造成了进程在进行切换等操作时都需要有比较费时的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程在演化中出现了另一个概念线程线程线程的概念线程的概念进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较费时的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程在演化中出现了另一个概念线程线程线程的概念v进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈数据段、代码段和堆栈段段,这就造成了进程在进行切换等操作时都需要有比较费时的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程在演化中出现了另一个概念线程线程v线程是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。线程的概念v进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈数据段、代码段和堆栈段段,这就造成了进程在进行切换等操作时都需要有比较费时的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程在演化中出现了另一个概念线程线程v线程是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。v同进程一样,线程也将相关的变量值放在线程控制表内。一个进程可以有多个线程,也就是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。要注意的是,由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响,因此,多线程中的同步就是非常重要的问题了 9.19.1LinuxLinux多线程相关多线程相关APIAPI Linux有多线程开发的有多线程开发的 Pthread 库支持。库支持。涉及多线程开发的最基本概念:涉及多线程开发的最基本概念:线程、互斥锁、条件。线程、互斥锁、条件。线程操作又分线程的线程操作又分线程的创建、退出、等待创建、退出、等待。互斥锁则包括互斥锁则包括 4 种操作:种操作:创建、销毁、加锁和解锁。创建、销毁、加锁和解锁。条件操作有条件操作有 5 种操作:种操作:创建、销毁、触发、广播和等待创建、销毁、触发、广播和等待。其他的一些线程扩展概念,如信号灯等,都可以通过上面其他的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素的基本操作封装出来。的三个基本元素的基本操作封装出来。9.19.1LinuxLinux多线程相关多线程相关APIAPIv线程v使用线程主要包括以下几个步骤:创建线程 调用相关线程函数 线程退出 线程资源回收9.1.1线程的创建Pthread不是linux系统默认的库,连接时需要使用库libthread.a执行顺序9.1.2线线程程终终止止此函数用来等待一个线程的结束。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。9.1.2 线程终止线程终止线程结束的两种途径:当函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit 来实现。阅读程序写出结果9.1.3线程的标识每个进程有一个进程ID,每个线程也有一个线程ID,进程ID在整个系统中是唯一的,但线程不同,线程ID只在它所属的进程环境中有效。线程ID用pthread_t数据类型来表示,实现的时候可以用一个结构来代表pthread_t数据类型,所以可以移植的操作系统不能把它作为整数处理。1pthread_self()函数函数用于获取自身线程的id。其函数原型为:#include pthread_t pthread_self(void);返回值:调用线程的线程id。2pthread_equal函数pthread_equal函数用于测试两个线程号ID是否相同。其函数原型为:#include int pthread_equal(pthread_t tid1,pthread_t tid2);返回值:测试两个线程号ID是否相同。若相等返回非0值,否则返回0。函数说明:函数中的参数tid1为线程1的ID,tid2 为线程2的ID。9.19.1LinuxLinux多线程相关多线程相关APIAPI Linux有多线程开发的有多线程开发的 Pthread 库支持。库支持。涉及多线程开发的最基本概念:涉及多线程开发的最基本概念:线程、互斥锁、条件。线程、互斥锁、条件。线程操作又分线程的线程操作又分线程的创建、退出、等待创建、退出、等待。互斥锁互斥锁则包括则包括 4 种操作:种操作:创建、销毁、加锁和解锁。创建、销毁、加锁和解锁。条件操作有条件操作有 5 种操作:种操作:创建、销毁、触发、广播和等待创建、销毁、触发、广播和等待。其他的一些线程扩展概念,如信号灯等,都可以通过上面其他的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素的基本操作封装出来。的三个基本元素的基本操作封装出来。9.2 线程访问控制线程访问控制解决的问题:v由于线程共享进程的资源和地址空间,因此在对这些资源进行操作时,必须考考虑到线程资源访问的惟一性虑到线程资源访问的惟一性问题。v主要介绍POSIX(可移植性操作系统接口)中线程同步的方法,主要有互斥锁互斥锁和信信号量号量的方式。v1.mutex互斥量线程控制v2.信号量线程控制(1)说明vmutex 是通过加锁来控制对共享资源的存取的一种简单方法。这个互斥量只有两种状态互斥量只有两种状态,也就是上锁上锁和解锁解锁,可以把互斥锁看作某种意义上的全局变量。1mutex 互斥量互斥量线程控制线程控制(1)说明vmutex 是通过加锁来控制对共享资源的存取的一种简单方法。这个互斥量只有两种状态互斥量只有两种状态,也就是上锁上锁和解锁解锁,可以把互斥锁看作某种意义上的全局变量。v在同一时刻只能有一个线程掌握某个互斥量互斥量上的锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经上锁了的互斥量,则该线程就会挂起,直到上锁的线程释放掉互斥量上的锁为止。可以说,这把互斥锁使得各个线程按序操作共享资源。1mutex 互斥量线程控制互斥量线程控制(1)说明vmutex 是通过加锁来控制对共享资源的存取的一种简单方法。这个互斥量只有两种状态互斥量只有两种状态,也就是上锁上锁和解锁解锁,可以把互斥锁看作某种意义上的全局变量。v在同一时刻只能有一个线程掌握某个互斥量互斥量上的锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经上锁了的互斥量,则该线程就会挂起,直到上锁的线程释放掉互斥量上的锁为止。可以说,这把互这把互斥锁使得各个线程按序操作共享资源。斥锁使得各个线程按序操作共享资源。1mutex 互斥量线程控制互斥量线程控制互斥锁互斥锁的操作主要包括以下几个步骤的操作主要包括以下几个步骤v互斥锁初始化:pthread_mutex_initv互斥锁上锁:pthread_mutex_lockv互斥锁判断判断上锁:pthread_mutex_trylockv互斥锁解锁:pthread_mutex_unlockv消除消除互斥锁:pthread_mutex_destroy(2)函数格式)函数格式互斥锁用pthread_mutex_t数据类型来表示,在使用互斥锁之前,必须首先对它进行初始化,通过调用pthread_mutex_init函数可以进行初始化静态和动态分配的互斥锁pthread_mutex_init函数用于初始化互斥锁函数用于初始化互斥锁。使用默认值初始化使用默认值初始化时为时为NULL 对共享资源的访问,对共享资源的访问,要对互斥量进行加锁,如果互斥量已经要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。在完成了对上了锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。共享资源的访问后,要对互斥量进行解锁。int pthread_mutex_trylock(pthread_mutex_t*mutex);v函数参数:参数mutex是互斥量v返回值:成功则返回0,出错则返回错误编号v函数说明:trylock函数,这个函数是非阻塞调用模是非阻塞调用模式式,也就是说,如果互斥量没被锁住,trylock函数将把互斥量加锁,并获得对共享资源的访问权限;如果互斥量被锁住了,trylock函数将不会阻塞等待而直接返回EBUSY,表示共享资源处于忙状态。互斥量解锁函数互斥量解锁函数#include int pthread_mutex_unlock(pthread_mutex_t*mutex);v函数参数:参数mutex是互斥量v返回值:成功则返回0,出错则返回错误编号v对互斥量解锁,需要调用pthread_mutex_unlock.(3)使用实例)使用实例vmain线程与thread_function交替运行,都可以对run_now进行操作。代表共享资源代表共享资源访问访问run_now的的function线程函数线程函数创建一个线程创建一个线程主线程执行的操作主线程执行的操作主线程执行的操作主线程执行的操作等待子线程结束以释放资源等待子线程结束以释放资源main线程和线程和function线程交替运线程交替运行,两者都可以实现对行,两者都可以实现对run_now的操作。如何实现对它的锁定?的操作。如何实现对它的锁定?为互斥量加锁代表共享资源代表共享资源访问访问run_now的的function线程函数线程函数定义互斥量定义互斥量main都干了什么?初始化互斥量初始化互斥量创建新线程创建新线程对互斥量上锁,上锁成对互斥量上锁,上锁成功显示功显示main lockmain都干了什么?执行循环操作执行循环操作给互斥变量解锁,显示给互斥变量解锁,显示解锁成功解锁成功收回互斥变量资源收回互斥变量资源等待线程结束,释放等待线程结束,释放资源资源“main都干了什么?”的简化版初始化互斥量初始化互斥量创建新线程创建新线程对互斥量上锁,上锁成对互斥量上锁,上锁成功显示功显示main lock执行循环操作执行循环操作给互斥变量解锁,显示给互斥变量解锁,显示解锁成功解锁成功收回互斥变量资源收回互斥变量资源等待线程结束,释放等待线程结束,释放资源资源简化后的main运行结果练习练习2信号量线程控制信号量线程控制(1)信号量说明v信号量也就是操作系统中所用到的PV 原语,它广泛用于进程或线程间的同步与互斥。信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。PV原语原语vPV原语是对整数计数器信号量sem的操作。一次P操作使sem减一,而一次V操作sem加一。进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。当信号量sem 的值大于等于零时,该进程(或线程)具有公共资源的访问权限;相反,当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0 为止。vPV 原语主要用于进程或线程间的同步和互斥这两种典型情况。若用于互斥,几个进程(或线程)往往只设置一个信号量sem,它们的操作流程如图。v当信号量用于同步操作时,往往会设置多个信号量,并安排不同的初始值来实现它们之间的顺序执行,它们的操作流程如图。(2)函数说
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 中学教育 > 初中教育


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号