phtread_mutex 组合
phtread_mutex通过mutexattr设定其类型,并保存在成员__kind中。pthread_mutex的锁操作函数根据__kind进行方法的分派(dispatch)。__kind由5个字段的位属性组成,其中4个字段可以通过mutexattr进行设定。通过属性的组合来决定锁的功能和行为。
低4位是基本类型,包括TIMED(有时等待),RECURSIVE(可递归),ERRORCHECK(不可递归),以及ADAPTIVE(有限自旋)。
这4种类型不能组合使用,最三种包含第一种。不论是设定为RECURSIVE,mutex一样都会记录owner的pid。当检测到递归时,TIMED和ADAPTIVE类型不作处理,会造成死锁。而RECURSIVE则作递归锁处理,ERRORCHECK则视为死锁停止进行锁操作,避免死锁。所以RECURSIVE和ERRORCHECK是两种不同方法对待锁递归可能造成的死锁问题。这4种类型的设定与futex的类型无关。
假设你已经明白 futex,pi-futex,pthread lowlevellow,rt_mutex。
<<linux 内核的futex>>
<<linux 内核的futex pi-support,即pi-futex使用rt_mutex委托>>
ROBUST属性字段,mutexattr中的mask为0x40000000,而__kind中的mask为0x4,共1位。锁是否需要额外服务,避免锁的持有线程退出而没有释放,造成其它阻塞线程的死锁问题。依赖robust-futex系统调用,由glibc去维护robust list。当一个线程在获得锁的同时,会将mutex链入到这个线程的robust链表中去。当这个线程没死又释放这个锁的之前,就会将mutex从线程的robust链表中摘除。
Protocol属性字段,mutexattr中的mask为0x30000000,而__kind中的mask为0x18,共2位。锁是否需要额外服务,避免优先级逆转的问题。对优先级逆转给出了3种处理协议,第一种不处理,第二种采用PI(优先级继承)算法,依赖pi-futex,第三种采用PP(优先级保护),依赖系统调度器提供的调度策略设定系统调用(sched_setscheduler),以及SCHED_FIFO调度策略。
使用PP协议处理优先级逆转问题时,必须为锁设定一个保护级别的优先级,ceiling。mutexattr中的mask为0x00fff000,而__lock中的mask为0xfff00000,共12位。由于__lock,即futex的高12位被用于存储ceiling,进行PP算法。与robust定义的锁规则不兼容。
Pshared属性字段,mutexattr中的mask为0x80000000,而__kind中的mask为0x20,共1位。锁是否需要进程间共享,即futex是否放在共享内存。这个属性和futex的地址,在内核中共同标记为一个futex_key。
elistion属性字段,则没有给出可以设定的接口。由pthread实现库来决定是否实现和使用。
当一个mutex的属性为0时,它等同于一个lowlevellock。
除了设定为PI协议的mutex,使用pi-futex,委托锁操作到rt_mutex。其余的使用futex_wait和futex_wake实现锁竞争服务。
蓝色框是 RECURSIVE 或 ERRORCHECK 的逻辑代码。
红色框是 PI 或 PP 协议依赖的调用。
紫色框是 底层的锁服务。
绿色框是 循环。
trylock:
lock:
unlock:
phtread_mutex 组合的更多相关文章
- futex-based pthread_cond
pthread_cond的实现使用了几个futex来协同进行同步,以及如何来实现的. 假定你已经明白 futex,futex-requeue,以及 pthread lowlevellock. < ...
- futex-based pthread_cond 源代码分析
pthread_cond的实现使用了几个futex来协同进行同步,以及如何来实现的. 假定你已经明白 futex,futex-requeue,以及 pthread lowlevellock. < ...
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- JS继承之借用构造函数继承和组合继承
根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...
- ComponentPattern (组合模式)
import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...
- 安卓自定义组合控件--toolbar
最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...
- UML类图(下):关联、聚合、组合、依赖
前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...
- 面向组合子设计Coder
面向组合子 面向组合子(Combanitor-Oriented),是最近帮我打开新世界大门的一种pattern.缘起haskell,又见monad与ParseC,终于ajoo前辈的几篇文章. 自去年9 ...
- Atitit 动态按钮图片背景颜色与文字组合解决方案
Atitit 动态按钮图片背景颜色与文字组合解决方案 转换背景颜色,setFont("cywe_img", fontScale, 50, 5) 设置文字大小与坐标 文字分拆,使用字 ...
随机推荐
- 帝国CMS万能标签的使用
标签名称: 带模板的信息调用标签[万能标签] [ecmsinfo]栏目ID/专题ID,显示条数,标题截取数,是否显示栏目名,操作类型,标签模板ID,只显示有标题图片[/ecmsinfo] 说明:e ...
- 解锁redis锁的正确姿势
解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...
- JS停止事件冒泡
..停止事件冒泡 JavaScript代码 //如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) //因此它支持W3C的stopP ...
- iOS开发之iOS程序的启动过程
程序启动的完整过程: (1)main函数 (2)UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 (3)delega ...
- 实验楼-4-Linux文件权限
$ ls -l /*查看文件权限*/ 每一行格式意思: <文件类型和权限 链接数 所有者 所在用户组 文件大小 上次修改时间 文件名> 文件类型和权限如下图: 解释: 软连接:类似于win ...
- 关于js参数传递矛盾新理解
之前看了很多人的解释,说js中,函数的参数传递都是值传递中不理解. 他们无非举了两个例子 在这两个例子中,第二个例子可以看出参数是由值传递的.因为函数内对象的变化没有影响到函数外对象的变化.但是在第一 ...
- unity3d 中文乱码解决方法——cs代码文件格式批量转化UTF8
在Unity3d中经常会碰到中文乱码的问题,比如代码中的[AddComponentMenu("GameDef/AI/战机AI")],注释,中文文本等等 其原因在于,unity本身是 ...
- as3中textField输入字符时,一次性过长后自动换行
txt_show.text = showStr; var str:String = txt_show.text; var strlen:int = str.length; var len:int = ...
- 3.Java集合总结系列:Set接口及其实现
一.Set接口 Set 接口与 List 接口相比没有那么多操作方法,比如: 1.List 接口能直接设置或获取某个元素的值,而Set接口不能. 2.List 接口能直接在指定位置删除.增加元素,而S ...
- Asp.NetCore之组件写法
本章内容和大家分享的是Asp.NetCore组件写法,在netcore中很多东西都以提供组件的方式来使用,比如MVC架构,Session,Cache,数据库引用等: 这里我也通过调用验证码接口来自定义 ...