第9章 线程间同步_第1页
第9章 线程间同步_第2页
第9章 线程间同步_第3页
第9章 线程间同步_第4页
第9章 线程间同步_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统原理及应用第9章线程间同步1信号量2互斥量3事件集45应用实例课后作业6本章总结线程间同步概念信号量工作机制9.1信号量信号量管理方式信号量应用方法本节小结9.1.1线程间同步概念线程间同步是指多个线程通过特定的机制来控制多个线程的执行顺序,线程间同步方式有信号量(semaphore)、互斥量(mutex)、和事件集(event),其核心思想是:在访问临界区的时候只允许一个(或一类)线程运行。9.1.1线程间同步概念电机1控制线程电机2控制线程电机1控制线程电机2控制线程正转30圈反转10圈反转20圈正转10圈9.1.2信号量工作机制信号量是一种轻型的用于解决线程间同步问题的内核对象。信号量工作示意图如图所示,信号量控制块是操作系统用于管理信号量的一个数据结构,用结构体structrt_semaphore表示,指向信号量控制块的指针称为信号量句柄,用rt_sem_t表示。./rt-thread/include/rtdef.hstructrt_ipc_object{structrt_objectparent;/*继承自rt_object*/rt_list_tsuspend_thread;/*等待线程队列*/};

structrt_semaphore{structrt_ipc_objectparent;/*继承自ipc_object类*/rt_uint16_tvalue;/*信号值*/rt_uint16_treserved;/*保留*/};typedefstructrt_semaphore*rt_sem_t;9.1.2信号量工作机制rt_semaphore结构体继承自rt_ipc_object,每个信号量都有一个信号值和一个线程等待队列,信号值最大为65535。./rt-thread/include/rtdef.hstructrt_ipc_object{structrt_objectparent;/*继承自rt_object*/rt_list_tsuspend_thread;/*等待线程队列*/};

structrt_semaphore{structrt_ipc_objectparent;/*继承自ipc_object类*/rt_uint16_tvalue;/*信号值*/rt_uint16_treserved;/*保留*/};typedefstructrt_semaphore*rt_sem_t;9.1.2信号量工作机制线程可以获取和释放信号量,每成功获取一次信号量,信号值减1,每成功释放一次信号量,信号值加1。线程在获取信号量时,首先被添加至线程等待链表,当轮到其获取信号量时,如果信号值大于0,线程可以直接获取到信号量,如果信号值为0,则该线程无法获取到信号量,其状态由运行状态转换为挂起状态,直到有其它线程释放信号量,信号值大于0时,该线程才能获取到信号量,由挂起状态转换为就绪状态。以生活中的停车场为例来解释信号量的工作机制:假设停车场有10个停车位,但有3个停车位都是空的,其余7个车位均被占用。如果此时驶来5辆车,则5辆车需排队进入停车场,其中前3辆车可以依次驶入停车场,占用3个停车位,这时10个停车位均被占用,因此后面的2辆车需继续排队等待,后续再驶来的车也须跟着排队等待,不允许驶入停车场。直到停车场内有车驶出,空出停车位,等待的车才允许驶入停车场,并占用该空车位。9.1.2信号量工作机制以生活中的停车场为例来解释信号量的工作机制:该例子中,空车位表示信号值,驶来的车表示线程,车驶入停车场并占用空停车位表示线程获取信号量,空位减1,信号值减1,当空位为0时,后续的车要在停车场外等待,即线程挂起。当有车辆驶出停车场,表示线程释放信号量,空车位加1,信号值加1,此时存在空车位,等待的车可以驶入停车场,挂起线程转换为就绪状态,在获得CPU使用权后进入运行状态,获取信号量,即占用该空车位,信号值再减1,如此循环。9.1.2信号量工作机制9.1.3信号量管理方式信号量根据内存管理方式不同,分为静态信号量和动态信号量,无论静态信号量还是动态信号量,都是通过信号量控制块进行管理的,相关函数在./rt-thread/src/ipc.c文件中实现,9.1.3信号量管理方式1.创建和删除信号量名称创建信号量函数原型rt_sem_trt_sem_create(constchar*name,rt_uint32_tvalue,rt_uint8_tflag)参数1name:信号量名称参数2value:信号量初始值参数3flag:信号量标志,可取RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO返回值成功返回信号量句柄,失败返回RT_NULL名称删除信号量函数原型rt_err_trt_sem_delete(rt_sem_tsem)参数sem:信号量句柄返回值成功返回RT_EOK9.1.3信号量管理方式2.获取和释放信号量名称获取信号量函数原型rt_err_trt_sem_take(rt_sem_tsem,rt_int32_ttime)参数1sem:信号量句柄参数2time:线程等待时间,单位为系统节拍,可填具体数值或RT_WAITING_FOREVER(永久等待)返回值成功获取信号量返回RT_EOK,超时未获得信号量返回-RT_ETIMEOUT,其它错误返回-RT_ERROR名称释放信号量函数原型rt_err_trt_sem_release(rt_sem_tsem)参数sem:信号量句柄返回值成功返回RT_EOK9.1.4信号量应用方法信号量的应用有固定的步骤,以动态信号量为例,包括如下4个步骤:(1)定义信号量句柄:rt_sem_tdsem=RT_NULL;(2)主线程创建信号量:dsem=rt_sem_create("dsem",0,RT_IPC_FLAG_FIFO);(3)线程1#X释放信号量:rt_sem_release(dsem);(4)线程2#Y获取信号量:rt_sem_take(dsem,RT_WAITING_FOREVER);9.1.4信号量应用方法注意:信号量句柄为全局变量。信号量要在线程启动前创建。两线程同步时,信号量初始值为0本节小结理解信号量的概念和工作机制;掌握信号量应用方法。互斥量概念互斥量工作机制9.2互斥量互斥量管理方式互斥量应用方法本节小结9.2.1互斥量概念互斥量又叫相互排斥的信号量,是一种特殊的二值信号量。互斥量类似于只有一个车位的停车场:当有一辆车进入的时候,将停车场大门锁住,其他车辆在外面等候。当里面的车出来时,将停车场大门打开,下一辆车才可以进入。9.2.2互斥量工作机制互斥量的状态只有两种:0和1。线程可以获取和释放互斥量,线程成功获取互斥量后,该线程拥有互斥量的所有权,称为持有线程,某一个时刻一个互斥量只能被一个线程持有。互斥量只能由持有线程释放互斥量,其它线程无权释放互斥量。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*继承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有线程的原始优先级*/rt_uint8_thold;/*持有线程的持有次数*/structrt_thread*owner;/*当前持有互斥量的线程*/};9.2.2互斥量工作机制互斥量的状态只有两种:0和1。当互斥量被某线程持有后,其它线程在获取互斥量时会因获取不到而被挂起,直到持有线程释放了互斥量,持有线程一旦释放互斥量,便失去互斥量的所有权,其它线程获取到互斥量,成为新的持有线程,其状态由挂起状态转换为就绪状态。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*继承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有线程的原始优先级*/rt_uint8_thold;/*持有线程的持有次数*/structrt_thread*owner;/*当前持有互斥量的线程*/};9.2.2互斥量工作机制互斥量的状态只有两种:0和1。持有线程可以多次获取互斥量,而不会被挂起,持有线程获取互斥量后要及时释放互斥量,以便其它线程能够获取到互斥量,需要注意的是持有线程获取几次,便应该释放几次。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*继承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有线程的原始优先级*/rt_uint8_thold;/*持有线程的持有次数*/structrt_thread*owner;/*当前持有互斥量的线程*/};9.2.2互斥量工作机制互斥量和信号量的不同点:互斥量:线程拥有互斥量的所有权,只能由持有线程释放;支持递归访问;能防止线程优先级翻转。信号量:线程不具有信号量的所有权,可以由任何线程释放;线程递归持有会形成死锁;可能发生线程优先级翻转。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*继承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有线程的原始优先级*/rt_uint8_thold;/*持有线程的持有次数*/structrt_thread*owner;/*当前持有互斥量的线程*/};9.2.2互斥量工作机制优先级翻转:当高优先级线程A通过信号量访问共享资源时,如果该信号量已被低优先级线程C持有,而线程C运行时被中等优先级线程B抢占,造成高优先级线程C被较低优先级线程阻塞,实时性难以得到保证。9.2.2互斥量工作机制9.2.2互斥量工作机制互斥量可以通过优先级继承算法解决优先级翻转问题。优先级继承:暂时提高低优先级线程C的优先级至高优先级线程A的优先级,避免线程C被中等优先级线程B抢占,当低优先级线程C释放资源时,再将其优先级复原。注意:获得互斥量后,请尽快释放互斥量,并且在持有互斥量的过程中,不得再行更改持有互斥量线程的优先级。9.2.2互斥量工作机制9.2.3互斥量管理方式9.2.4互斥量应用方法互斥量的应用有固定的步骤,以动态互斥量为例,包括如下4个步骤:(1)定义互斥量句柄:rt_mutex_tdmutex=RT_NULL;(2)主线程创建互斥量:dmutex=rt_mutex_create("dmutex",0,RT_IPC_FLAG_FIFO);(3)线程获取互斥量:rt_mutex_release(dmutex);(4)持有线程释放互斥量:rt_mutex_take(dmutex,RT_WAITING_FOREVER);9.2.4互斥量应用方法注意:互斥量句柄为全局变量。互斥量要在线程启动前创建。谁持有谁释放,尽快释放。本节小结理解互斥量的概念和工作机制;掌握互斥量应用方法。事件集概念事件集工作机制9.3事件集事件集管理方式事件集应用方法本节小结9.3.1事件集概念事件集是多个事件的集合,用与实现一对多,多对多的同步。以坐公交为例,在公交站等公交时可能有以下几种情况:(1)P1坐公交去某地(线程),只有一种公交可以到达目的地,等到此公交即可出发(特定事件唤醒线程);(2)P1坐公交去某地,有3种公交都可以到达目的地,等到其中任意一辆即可出发(任意单个事件唤醒线程);(3)P1约另一人P2一起去某地,则P1必须要等“P2到达公交站”与“公交到达公交站”(事件)两个条件都满足后,才能出发(多个事件同时发生才唤醒线程)。9.3.2事件集工作机制事件集控制块是操作系统用于管理事件集的一个数据结构,用结构体structrt_event表示,指向事件集控制块的指针称为事件集句柄,用rt_event_t表示。./rt-thread/include/rtdef.hstructrt_event{structrt_ipc_objectparent;/*继承自ipc_object*/rt_uint32_tset;/*事件集*/};typedefstructrt_event*rt_event_t;9.3.2事件集工作机制每个线程都拥有一个事件信息标记,它有三个属性:RT_EVENT_FLAG_AND(逻辑与),RT_EVENT_FLAG_OR(逻辑或)和RT_EVENT_FLAG_CLEAR(清除标记)。9.3.3事件集管理方式9.3.3事件集管理方式1.发送事件名称发送事件函数原型rt_err_trt_event_send(rt_event_tevent,rt_uint32_tset)参数1event:事件集句柄参数2set:发送一个或多个事件的标志值返回值成功返回RT_EOK9.3.3事件集管理方式2.接收事件名称接收事件函数原型rt_err_trt_event_recv(rt_event_tevent,rt_uint32_tset,rt_uint8_toption,rt_int32_ttimeout,rt_uint32_t*recved)参数1event:事件集句柄参数2set:接收线程感兴趣的事件参数3option:接收选项RT_EVENT_FLAG_OR/RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR参数4timeout:超时时间参数5recved:指向接收的事件返回值成功返回RT_EOK,超时返回-RT_ETIMEOUT,其它错误返回-RT_ERROR9.3.4事件集应用方法事件集的应用有固定的步骤,以动态事件集为例,包括如下5个步骤:(1)宏定义事件:#defineE1(1<<1)

#defineE2(1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论