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委托>>

<<pthread的lowlevellock>>

<<linux 内核的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 组合的更多相关文章

  1. futex-based pthread_cond

    pthread_cond的实现使用了几个futex来协同进行同步,以及如何来实现的. 假定你已经明白 futex,futex-requeue,以及 pthread lowlevellock. < ...

  2. futex-based pthread_cond 源代码分析

    pthread_cond的实现使用了几个futex来协同进行同步,以及如何来实现的. 假定你已经明白 futex,futex-requeue,以及 pthread lowlevellock. < ...

  3. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  4. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  5. ComponentPattern (组合模式)

    import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...

  6. 安卓自定义组合控件--toolbar

    最近在学习安卓APP的开发,用到了toolbar这个控件, 最开始使用时include layout这种方法,不过感觉封装性不好,就又改成了自定义组合控件的方式. 使用的工具为android stud ...

  7. UML类图(下):关联、聚合、组合、依赖

    前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...

  8. 面向组合子设计Coder

    面向组合子 面向组合子(Combanitor-Oriented),是最近帮我打开新世界大门的一种pattern.缘起haskell,又见monad与ParseC,终于ajoo前辈的几篇文章. 自去年9 ...

  9. Atitit 动态按钮图片背景颜色与文字组合解决方案

    Atitit 动态按钮图片背景颜色与文字组合解决方案 转换背景颜色,setFont("cywe_img", fontScale, 50, 5) 设置文字大小与坐标 文字分拆,使用字 ...

随机推荐

  1. python自学基础1week

    一.python老师介绍 二.为什么要学习python? 三.学习python有前途吗? 疗程1:语言基础 疗程2:网络编程 疗程3:web基础开发 疗程4:算法&设计模式 疗程5:pytho ...

  2. HTML5本地图片裁剪并上传

    最近做了一个项目,这个项目中需要实现的一个功能是:用户自定义头像(用户在本地选择一张图片,在本地将图片裁剪成满足系统要求尺寸的大小).这个功能的需求是:头像最初剪切为一个正方形.如果选择的图片小于规定 ...

  3. Win10下 VS2017 安装失败 未能安装包“Microsoft.VisualStudio.AspNet45.Feature,version=15.0.26208.0”

    事情的起因是这样的,前段时间,VS2017发布当天,想在自己的Win10上安装VS2017,然而,由于自己的系统很久没有更新(PS:自己关闭了Windows更新). 安装提示:未能安装包“Micros ...

  4. 当Node.js遇见Docker

    Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promi ...

  5. Spring + qyartz+多任务实现任务调度功能。

    前记:如果配置多个任务不能触发的请仔细检查配置文件!!!!!! 不存在多个同时间任务不能触发的现象!!!! 这个东西记得不要设置成false.如果写了就是true.不写的话默认true. 下面开始贴配 ...

  6. PHPSTORM下安装XDEBUG

    本文不是教程安装XDEBUG,具体的请自行百度(我也是按照百度上的一步步来的). 以下纠正几点目前我安装时查看播客的不对之处: 1. Setting > PHP > DEBUG > ...

  7. 【C语言】判断三角形类型

    根据输入的三角形的三边判断三角形的类型,并输出其面积和类型. #include<stdio.h> #include<stdlib.h> #include<math.h&g ...

  8. smartGWT DataSource数据动态加载

    昨天和今天早上,用DataSource从数据库后台动态加载数据,我的业务是这样的: 我有两个SelectItem选择框,第一个选择框里面的数据是单位,第二个选择框中的数据是对应单位的人,因为人可能有重 ...

  9. 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

  10. poj 3128 Leonardo's Notebook (置换群的整幂运算)

    题意:给你一个置换P,问是否存在一个置换M,使M^2=P 思路:资料参考 <置换群快速幂运算研究与探讨> https://wenku.baidu.com/view/0bff6b1c6bd9 ...