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) 设置文字大小与坐标 文字分拆,使用字 ...
随机推荐
- CentOS 下安装 Node npm pm2
1.node安装 参考:http://blog.csdn.net/haidaochen/article/details/7257655 下载,你需要在https://nodejs.org/en/dow ...
- Java变量和对象的作用域
大多数程序设计语言都提供了"作用域"(Scope)的概念. 对于在作用域里定义的名字,作用域同时决定了它的"可见性"以及"存在时间".在C, ...
- dellR720重启找不到启动引导项,手动选择也无用。
机器重启后显示 no boot device available.(如下图)检查bios中设置也是没问题的,因为装完系统后根本没动过什么.F11手动选择启动项也还是会跳到这里来. 这台机子做的Raid ...
- Sublime Text前端开发环境配置
Sublime Text是前端开发不可不说的编辑器,本文以Sublime Text 3为例讲解一下如何搭建前端的开发环境. 下载Sublime Text 3 下载地址 #==> Sublime ...
- Linux之第一个shell命令
今天在学习shell脚本的编写,网上看了一个helloworld的栗子: #!/bin/sh #print hello world in the console window a = "he ...
- Object-C知识点
Object-C常用的知识点,以下为我在实际开发中用到的知识点,但是又想不起来,需要百度一下的知识点 1. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: ...
- [SinGuLaRiTy] 最短路计算代码库
[SinGuLaRiTy-1002] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. Dijkstra: 题目描述 有向图的单源点最短路问题( ...
- laravel资源路由详解
大概挑两条解释. 我定义了个资源路由Route::resource('article', 'ArticleController');. 当我访问地址ArticleController的http://y ...
- poj 1721 CARDS (置换群)
题意:给你一个数列,第i号位置的数位a[i],现在将数列进行交换,交换规则为a[i]=a[a[i]]:已知交换s次之后的序列,求原先序列 思路:置换的问题必然存在一个循环节,使一个数列交换n次回到原来 ...
- Angularjs 动态添加指令并绑定事件
先说使用场景,动态生成DOM元素并绑定事件,非常常见的一种场景,用jq实现效果: http://jsbin.com/gajizuyuju/edit?html,js,output var count=0 ...