野火RTT第20章互斥量
2018年12月29日
10:47

互斥量不能在中断服务程序中使用。

互斥量是特殊的二值信号量,其“特殊”在哪呢?互斥量不同于二值信号量的地方在于:互斥量具有独占性(所有权)、递归性、优先级继承机制。
二值信号量不能防止优先级翻转。

为啥要有互斥量,二值信号量不就够了?后来一想,这是互斥量的特殊性,也为了方便管理,还是从信号量里面独立出来吧。这样的话函数好调用、也简单化了。否则形参又要复杂了。
把互斥量从二值信号量独立起来,代码编写更简洁,就不用考虑什么兼容二值信号量了。发挥的空间就更大了。

我发现RTT的函数的形参很少,很简单,越简单越好用、维护越容易、越简洁越美越有生命力。
互斥量是特殊的二值信号量,支持防优先级翻转,递归访问,互斥所有权,实现对临界资源的独占式处理。
互斥量只有两种状态:开锁和闭锁。
闭锁:被线程占用时的状态。
开锁:被占用线程释放后的状态。
所有权或者独占式:占用该互斥量的线程具有该互斥量的所有权,且独占——其他线程不能开锁或闭锁。——这是我的!!!独,很独!这个互斥量的锁是我的,别人不能开也不能闭锁!我的,别的线程不能动我的锁!
递归性:当有别的线程访问了该互斥量后,但是持有该互斥量的线程可以再次获取这个锁而不会被挂起。
二值信号量擅长同步(线程之间、线程与中断之间),而互斥量擅长保护资源的互锁。
优先级继承算法:持有资源的线程优先级临时提高到等待该资源的所有线程中最高优先级的优先级。临时提高优先级的操作就叫做优先级继承。这是互斥量具有,而信号量不具有的。

优先级翻转:高优先级线程不能运行而低优先级可以运行的现象。

野火例程:
1.H优先级线程先运行第一次获取互斥量,进行互斥量所有权操作:互斥量所有者,闭锁,互斥量占用线程的原始优先级,互斥量持有计数+1。接着进入阻塞延时,跳到L优先级线程。
2.L优先级要获取这个互斥量,但是已经闭锁了,因为L获取是无限等待的,所以会将其阻塞:从系统优先级表干掉,将其线程插入互斥量自带的阻塞链表中(按照优先级插入的,因为创建互斥量时flag参数选的是优先级排列)。执行调度,跳到H线程。
3.H线程执行释放互斥量,此时H线程具有互斥量所有权,所以互斥量持有计数减1,于是持有计数为0,于是处于开锁状态,切换到等待互斥量最高优先级的线程来持有:恢复原优先级,恢复被阻塞的最高优先级线程,将互斥量所有权转给它。并执行调度。因为此时H线程还是最高优先级所以还是执行H线程。
3,跳过时间片。线程H重头运行,第2次获取互斥量。由于此时互斥量所有权属于L线程了,H线程被阻塞,L线程发生优先级继承操作。发生调度,执行L线程。(原来优先级继承发生在互斥量获取函数中,也就是有更高优先级获取闭锁的互斥量会发生持有者线程继承优先级)
4,L线程执行查询H线程是都正常获取与释放,打印出信息。L线程释放互斥量所有权:L线程优先级恢复原始值, 唤醒阻塞线程H。执行调度,切换到H线程。
5.H线程执行阻塞延时,切换到L线程。L线程执行更大的阻塞延时,再次切换到H线程。
6,H线程释放互斥量所有权:这是真正的释放,恢复优先级,没有阻塞线程也就是没有等待这个互斥量的线程(L还没有获取而阻塞,目前只是L线程是阻塞延时主动放弃CPU使用权),互斥量的值、优先级、持有计数值等全部恢复到互斥量创建时的初始值。于是实现真正的开锁。
7,H线程执行时间片调度。结束继续重头循环。第三次获取互斥量,再次持有这个互斥量。然后阻塞延时,但是L线程还处于阻塞延时状态,于是会去执行空闲线程,然后等H的阻塞延时到了再执行H线程。接着执行互斥量释放。因为没有等待这个互斥量的线程,所以这是真正的释放,恢复互斥量创建时的初始值。就这样不断的循环,直到L线程的阻塞延时时间到,处于就绪状态,只等H线程进入阻塞延时。
8,一旦H进入阻塞延时就要重复1-7的循环。

总结来说:(1)当高优先级线程去获取闭锁状态的互斥量时,会发生优先级继承:持有者暂时提升为高优先级线程的优先级。当互斥量持有者释放时,又会恢复初始优先级(这就是为啥互斥量控制块里有初始优先级和当前优先级的成员,是为了优先级继承保证优先级翻转危害发生最低做准备)。(2)只有没有等待互斥量的线程时,才会恢复创建互斥量时的初始状态。(3)持有者线程释放互斥量时如果有等待这个互斥量(被阻塞了)的话,会把所有权交给这些等待的线程的(根据互斥量创建时是优先级排队还是先进先出排队来交接、传递这个所有权)。

RTT的线程同步篇——互斥量相关推荐

  1. 1线程同步:互斥量,死锁

     1线程为什么要同步 A:共享资源,多个线程都可对共享资源操作. B:线程操作共享资源的先后顺序不确定. C:处理器对存储器的操作一般不是原子操作. 2互斥量 mutex操作原语 pthread_ ...

  2. 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...

    一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...

  3. 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

    多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...

  4. RTT的线程同步篇——总结

    一.信号量和互斥量的区别 2018年12月29日 10:47 信号量强调做事的步骤,有先后. 信号量可以在任何任务.中断里释放信号量,释放了你才能做下一步. 信号量可能发生优先级翻转. 信号量不能递归 ...

  5. 线程同步之互斥量(互斥锁)

    1 同步的概念 所谓同步, 即同时起步,协调一致.不同的对象, 对"同步" 的理解方式略有不同. 如,设备同步,是指在两个设备之间规定一个共同的时间参考: 数据库同步, 是指让两个 ...

  6. 线程同步之互斥量加锁解锁 死锁

    与互斥锁相关API       互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁.对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻 ...

  7. 线程同步之——互斥量及死锁问题

    互斥量:多个线程同时访问共享数据时可能会冲突,这跟信号的可重性是同样的问题.如 果两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 1. 从内存读变量值到寄存器 2. 寄存器的值加 ...

  8. linux线程同步(1)-互斥量

    一.概述                                                   互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行 ...

  9. linux操作系统之线程同步及互斥量

    (1)线程同步 1)线程同步:指一个线程发出某一个功能运行时,在运行还没有结束的时候,该调用不返回.同时其它线程为保证数据的一致性,不能调用该功能. 2)多个控制流共同操作一个共享资源的时候,都需要同 ...

最新文章

  1. python batch normalization_python – Keras BatchNormalization,样本明智规范化究竟是什么?...
  2. Linux进程的Uninterruptible sleep(D)状态
  3. matlab中gui关闭图像直方图,07年写的,直方图 matlab gui
  4. 团队招人的笔试题,我的回答。
  5. HD Piggy-Bank完全背包
  6. pythonweb扫描器_Python安全工具之web目录扫描
  7. 【Python数据挖掘课程】九.回归模型LinearRegression简单分析氧化物数据
  8. 拉屎能赚钱?在马桶上月入过万?原来卫生间里还有这么多隐藏福利,超模君都惊了……
  9. android 仿京东地址选择_Android 开发:仿美团地址选择
  10. springboot redis 断线重连_Redis(9)——史上最强【集群】入门实践教程
  11. JavaScript错误处理和堆栈追踪浅析
  12. 【飞秋】Asp.net MVC2 model验证 看似美好,实则让人失望。
  13. js用递归遍历多维数组_JavaScript树结构操作:查找、遍历、筛选、树结构和列表结构相互转换...
  14. c++编程规范101条规则
  15. 在给Ext2 Grid设置了autoHeight属性后,如何显示滚动条
  16. 如何建立“开箱即用”的数据安全防护系统 | 专家对话
  17. 【BlackHat】速修复!有人正在扫描 Exchange 服务器寻找 ProxyShell 漏洞
  18. 自从用了Less 编写css,你比以前更快了~
  19. 用css实现文本不换行切超出限制时显示省略号(小tips)
  20. 华为云备份会上传私密相册吗_华为、小米都是国产手机,为啥文件夹却是“英文”?哪些能删除?...

热门文章

  1. Step By Step(Lua字符串库)
  2. SQL Server群集共享存储迁移
  3. CCNA试验-NAT
  4. 由“美图秀秀”软件的网站,看网站的生存模式
  5. oracle关于分区,关于Oracle分区
  6. devops 文化_为什么回馈对DevOps文化很重要
  7. 华为开源构建工具_5个开源工具可快速构建地图应用
  8. raspberry pi_Linux Foundation安全徽章,Raspberry Pi成功,白宫工具等
  9. git下载及安装向导如何配置
  10. 十年 | 在Java开发做了10年后,才学会此绝招,用于颠覆Java应用