当前位置: 首页 > news >正文

贵阳市住房城乡建设局八大员网站深圳市房地产信息平台

贵阳市住房城乡建设局八大员网站,深圳市房地产信息平台,关键字优化工具,企业网站营销的实现方式解读目录 概述 1 互斥量定义 1.1 概念介绍 1.2 线程优先级翻转问题 2 互斥量管理 2.1 结构体定义 2.2 函数接口介绍 2.2.1 rt_mutex_create函数 2.2.2 rt_mutex_delete 函数 2.2.3 初始化和脱离互斥量 概述 本文主要介绍互斥量的概念,实现原理。还介绍RT-Thre…

目录

概述

1 互斥量定义

1.1 概念介绍

1.2 线程优先级翻转问题

2 互斥量管理

2.1 结构体定义

2.2 函数接口介绍

2.2.1 rt_mutex_create函数

2.2.2 rt_mutex_delete 函数

2.2.3 初始化和脱离互斥量


概述

本文主要介绍互斥量的概念,实现原理。还介绍RT-Thread中互斥量的相关接口。

1 互斥量定义

1.1 概念介绍

互斥量又叫相互排斥的信号量,是一种特殊的二值信号量。互斥量类似于只有一个车位的停车场:当有一辆车进入的时候,将停车场大门锁住,其他车辆在外面等候。当里面的车出来时,将停车场大门打开,下一辆车才可以进入。

互斥量和信号量不同的是:拥有互斥量的线程拥有互斥量的所有权,互斥量支持递归访问且能防止线程优先级翻转;并且互斥量只能由持有线程释放,而信号量则可以由任何线程释放

互斥量的状态只有两种,开锁或闭锁(两种状态值)。

当有线程持有它时,互斥量处于闭锁状态,由这个线程获得它的所有权。

相反,当这个线程释放它时,将对互斥量进行开锁,失去它的所有权。

当一个线程持有互斥量时,其他线程将不能够对它进行开锁或持有它,持有该互斥量的线程也能够再次获得这个锁而不被挂起,如下图时所示。这个特性与一般的二值信号量有很大的不同:在信号量中,因为已经不存在实例,线程递归持有会发生主动挂起(最终形成死锁)。

1.2 线程优先级翻转问题

使用信号量会导致的另一个潜在问题是线程优先级翻转问题。

所谓优先级翻转,即当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,实时性难以得到保证。

如下图所示:有优先级为 A、B 和 C 的三个线程,优先级 A> B > C。

step -1: 线程 A,B 处于挂起状态,等待某一事件触发,线程 C 正在运行,此时线程 C 开始使用某一共享资源 M。

step-2: 在使用过程中,线程 A 等待的事件到来,线程 A 转为就绪态,因为它比线程 C 优先级高,所以立即执行。

step-3: 但是当线程 A 要使用共享资源 M 时,由于其正在被线程 C 使用,因此线程 A 被挂起切换到线程 C 运行。

step-4: 如果此时线程 B 等待的事件到来,则线程 B 转为就绪态。由于线程 B 的优先级比线程 C 高,且线程B没有用到共享资源 M ,因此线程 B 开始运行,直到其运行完毕,线程 C 才开始运行。

只有当线程 C 释放共享资源 M 后,线程 A 才得以执行。在这种情况下,优先级发生了翻转:线程 B 先于线程 A 运行。这样便不能保证高优先级线程的响应时间。

在 RT-Thread 操作系统中,互斥量可以解决优先级翻转问题,实现的是优先级继承协议 (Sha, 1990)。优先级继承是通过在线程 A 尝试获取共享资源而被挂起的期间内,将线程 C 的优先级提升到线程 A 的优先级别,从而解决优先级翻转引起的问题。这样能够防止 C(间接地防止 A)被 B 抢占,如下图所示。优先级继承是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。

2 互斥量管理

2.1 结构体定义

在 RT-Thread 中,互斥量控制块是操作系统用于管理互斥量的一个数据结构,由结构体 struct rt_mutex 表示。另外一种 C 表达方式 rt_mutex_t,表示的是互斥量的句柄,在 C 语言中的实现是指互斥量控制块的指针。互斥量控制块结构的详细定义请见以下代码:

struct rt_mutex{struct rt_ipc_object parent;                /* 继承自 ipc_object 类 */
​rt_uint16_t          value;                   /* 互斥量的值 */rt_uint8_t           original_priority;     /* 持有线程的原始优先级 */rt_uint8_t           hold;                     /* 持有线程的持有次数   */struct rt_thread    *owner;                 /* 当前拥有互斥量的线程 */};/* rt_mutext_t 为指向互斥量结构体的指针类型  */typedef struct rt_mutex* rt_mutex_t;

rt_mutex 对象从 rt_ipc_object 中派生,由 IPC 容器所管理。

2.2 函数接口介绍

互斥量控制块中含有互斥相关的重要参数,在互斥量功能的实现中起到重要的作用。互斥量相关接口如下图所示,对一个互斥量的操作包含:创建 / 初始化互斥量、获取互斥量、释放互斥量、删除 / 脱离互斥量。

2.2.1 rt_mutex_create函数

创建一个互斥量时,内核首先创建一个互斥量控制块,然后完成对该控制块的初始化工作。创建互斥量使用下面的函数接口:

rt_mutex_t rt_mutex_create (const char* name, rt_uint8_t flag);

可以调用 rt_mutex_create 函数创建一个互斥量,它的名字由 name 所指定。当调用这个函数时,系统将先从对象管理器中分配一个 mutex 对象,并初始化这个对象,然后初始化父类 IPC 对象以及与 mutex 相关的部分。互斥量的 flag 标志已经作废,无论用户选择 RT_IPC_FLAG_PRIO 还是 RT_IPC_FLAG_FIFO,内核均按照 RT_IPC_FLAG_PRIO 处理。下表描述了该函数的输入参数与返回值:

参数描述
name互斥量的名称
flag该标志已经作废,无论用户选择 RT_IPC_FLAG_PRIO 还是 RT_IPC_FLAG_FIFO,内核均按照 RT_IPC_FLAG_PRIO 处理
返回——
互斥量句柄创建成功
RT_NULL创建失败

2.2.2 rt_mutex_delete 函数

当不再使用互斥量时,通过删除互斥量以释放系统资源,适用于动态创建的互斥量。删除互斥量使用下面的函数接口:

rt_err_t rt_mutex_delete (rt_mutex_t mutex);

当删除一个互斥量时,所有等待此互斥量的线程都将被唤醒,等待线程获得的返回值是 - RT_ERROR。然后系统将该互斥量从内核对象管理器链表中删除并释放互斥量占用的内存空间。下表描述了该函数的输入参数与返回值:

参数描述
mutex互斥量对象的句柄
返回——
RT_EOK删除成功

2.2.3 初始化和脱离互斥量

静态互斥量对象的内存是在系统编译时由编译器分配的,一般放于读写数据段或未初始化数据段中。在使用这类静态互斥量对象前,需要先进行初始化。初始化互斥量使用下面的函数接口:

rt_err_t rt_mutex_init (rt_mutex_t mutex, const char* name, rt_uint8_t flag);

使用该函数接口时,需指定互斥量对象的句柄(即指向互斥量控制块的指针),互斥量名称以及互斥量标志。互斥量标志可用上面创建互斥量函数里提到的标志。下表描述了该函数的输入参数与返回值:

参数描述
mutex互斥量对象的句柄,它由用户提供,并指向互斥量对象的内存块
name互斥量的名称
flag该标志已经作废,无论用户选择 RT_IPC_FLAG_PRIO 还是 RT_IPC_FLAG_FIFO,内核均按照 RT_IPC_FLAG_PRIO 处理
返回——
RT_EOK初始化成功

脱离互斥量将把互斥量对象从内核对象管理器中脱离,适用于静态初始化的互斥量。脱离互斥量使用下面的函数接口:

rt_err_t rt_mutex_detach (rt_mutex_t mutex);

使用该函数接口后,内核先唤醒所有挂在该互斥量上的线程(线程的返回值是 -RT_ERROR),然后系统将该互斥量从内核对象管理器中脱离。下表描述了该函数的输入参数与返回值:

参数描述
mutex互斥量对象的句柄
返回——
RT_EOK成功

 

http://www.yayakq.cn/news/807280/

相关文章:

  • 网站开发 设计制作合同精准营销平台
  • 网站导航栏特效音乐网站建设课的期末报告书
  • 重庆做的好的房产网站好产品设计专业介绍
  • php网站开发实用技术课后习题免费传奇无充值
  • 高端网站建设策划四川建设安全生产监督管理局网站
  • 深圳建设网站和公众号零食店网站构建策划报告
  • 代写网站建设合同高德地图实况街景怎么打开
  • 淘宝联盟推广网站怎么做手机网站自动跳转怎么解决
  • 苏州建设交易中心网站php培训学校网站源码
  • 渭南市建网站佛山网页设计师培训
  • 做网站jsp好还是标准网站优势
  • 南山最专业的网站建设做网站需要买什么
  • 做网站的傻瓜软件网站建设合同协议
  • 合肥网站建设服务设计工作室装修
  • 做网站去哪里做好陕西商城网站建设
  • 湖南网站建设公司 干净磐石网络网站内文章外链如何做
  • 制作网站的步骤和过程宁波网站建设哪家公司好
  • 有动效网站在线网页设计器
  • c 网站开发实例深圳市住房和建设局官网网址
  • 做网站教程pdfseo引擎优化
  • 微信小程序 做网站wordpress shortcodes
  • 高端手机淄博seo
  • 关注网站怎么做郑州最新发布信息
  • 关于网络编辑作业做网站栏目新闻的pptwordpress 主题 不兼容
  • 网站建设竞标需要怎么做怎么将自己做的网站放到网上
  • 怎么用PS做网站广告图上海展台搭建商
  • 口碑营销的案例及分析南昌seo网站排名
  • google seo网站 被k手机影视网站开发
  • 做网站去哪个平台信用信息查询公示系统
  • 常州网站建设招聘电子商务哪个专业最吃香