- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式应用程序设计第5章 节 嵌入式Linux多线程编程.ppt
嵌入式应用程序设计第5章 嵌入式Linux多任务编程
第1章 搭建嵌入式Linux开发环境
第2章 嵌入式文件I/O编程
第3章 嵌入式Linux多任务编程
第4章 嵌入式Linux进程间通行
第5章 嵌入式Linux多线程编程
第6章 嵌入式Linux网络编程
第7章 Qt图形编程
第8章 嵌入式Linux设备驱动编程
第9章 Qt聊天项目设计
课程安排:
5.1 线程基本编程
5.2 线程之间的同步与互斥
5.3 线程属性
5.4 多线程实验
5.5 小结
5.6 思考与练习
本章课程:
1.1.1 嵌入式系统简介
计算机、通信、消费电子的一体化趋势
嵌入式系统定义:
嵌入式系统是指以应用为中心,以计算机技术为基础,软件硬件可剪裁,适应应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
硬件+软件
硬件:由嵌入式微处理器、外围硬件设备组成
软件:括底层系统软件和用户应用软件
嵌入式系统应用领域:
5.1 线程基本编程
创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create()。
在线程创建之后,就开始运行相关的线程函数,在该函数运行完之后,该线程也就退出了,这也是线程退出的一种方法。另一种退出线程的方法是使用函数pthread_exit(),这是线程的主动行为。
pthread_join()可以用于将当前线程挂起来等待线程的结束。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回。
pthread_cancel() 向其他线程发送终止信号,但在被取消的线程的内部需要调用pthread_setcancel()函数和pthread_setcanceltype()函数设置自己的取消状态。
5.1 线程基本编程
5.2.1 互斥锁线程控制
互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。
互斥锁只有两种状态,也就是上锁和解锁,可以把互斥锁看作某种意义上的全局变量。
在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。
互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。这三种锁的区别主要在于其他未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待。快速锁是指调用线程会阻塞直至拥有互斥锁的线程解锁为止。递归互斥锁能够成功地返回,并且增加调用线程在互斥上加锁的次数,而检错互斥锁则为快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息。默认属性为快速互斥锁。
5.2 线程之间的同步和互斥
5.2.1 互斥锁线程控制
互斥锁的基本操作:
互斥锁初始化:pthread_mutex_init()
互斥锁上锁:pthread_mutex_lock()
互斥锁判断上锁:pthread_mutex_trylock()
互斥锁接锁:pthread_mutex_unlock()
消除互斥锁:pthread_mutex_destroy()
5.2 线程之间的同步和互斥
5.2.1 互斥锁线程控制
pthread_mutex_init()函数语法:
5.2 线程之间的同步和互斥
5.2.1 互斥锁线程控制
pthread_mutex_lock()函数语法:
5.2 线程之间的同步和互斥
5.2.2 信号量线程控制
信号量也就是操作系统中所用到的PV原子操作,它广泛用于进程或线程间的同步与互斥。信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。
PV原子操作是对整数计数器信号量sem的操作。一次P操作使sem减一,而一次V操作使sem加一。进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限;相反,当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0为止。
5.2 线程之间的同步和互斥
5.2.2 信号量线程控制
PV原子操作主要用于进程或线程间的同步和互斥这两种典型情况。
5.2 线程之间的同步和互斥
互斥
同步
5.2.2 信号量线程控制
Linux实现了POSIX的无名信号量,主要用于线程间的互斥与同步。这里主要介绍几个常见函数。
sem_init()用于创建一个信号量,并初始化它的值。
sem_wait()和sem_trywait()都相当于P操作,在信号量大于零时它们都能将信号量的值减一,两者的区别在于若信号量小于零时,sem_wait()将会阻塞进程,而sem_trywait()则会立即返回。
sem_pos
文档评论(0)