工具类之Mutex
Mutex在Android4.4的源代码包的./system/core/include/utils/Mutex.h中定义并且实现。
我们先复习一下Mutex在Linux中功能:
Mutex出生的意义就是在多个线程中同一时间只有一个线程可以访问Mutex要保护的数据。
它的工作原理是某一个线程要访问公共资源的时候先锁定这个mutex,完成操作之后对mutex解锁,在此期间如果有其它的线程也要访问公共资源,它就先要去锁mutex,当它发现mutex已经被锁住了,那么这个线程就是阻塞在那儿。等mutex解锁之后所有阻塞在mutex的线程都会醒来,只有第一个醒来的会抢到mutex,其它没有抢到的发现自己晚了一步,只能继续阻塞在那儿,等待下次机会。
任何东西都不可能是完美的,Mutex也不是,所以它会死锁,一个线程锁定mutex两次,线程就会进入死锁状态,为了避免这个问题,可以用trylock,但是如果你的线程使用的mutex不只有一个,那么问题就复杂了,比如有两个线程,各自锁定一个mutex等待锁定另一个,那么这两个线程都进入了死锁状态,不死不休。
Mutex有以下几个操作:
int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict tsptr);
pthread_mutex_lock的性格简单粗暴,直接就奔着mutex去了,锁不上俺着等着。
pthread_mutex_trylock比较圆滑,锁不住mutex也不阻塞,返回个错误值交给下面的代码去解决。
pthread_mutex_unlock也比较粗暴,管你有没有锁定mutex,就解锁,就是这么任性。要知道unlock一个未锁定的mutex结果是undefined behavior results,啥意思,“后果自负”
pthread_mutex_timedlock比它大哥 pthread_mutex_lock脾气好些,知道转个弯,设置个超时值。
在Linux中mutex可用于线程也可用于进程,区别在于private还是shared。同样,android中的Mutex是系统相关的,意思就是Mutex类就是对linux中mutex的包装,所以它也可以用于线程和进程,同样分为private和shared
Mutex我们复习完了,现在看看Android中的做法
Mutex的构造函数有三个,可以无需参数,也可以带一个名子,还可以带个名子的同时带一个类型。它的操作也还是那三个lock,unlock以及trylock,这些也都是和我们之前了解的相同。
为了简化一般的mutex操作,在class Mutex中定义了一个内部类Autolock,它利用{}作用域实现自动解锁,看一下它的构造函数就知道了:
inline Autolock(Mutex& mutex) : mLock(mutex) { mLock.lock(); }
inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); }
创建对象的同时锁住传入的mutex,再看它的析构函数:
inline ~Autolock() { mLock.unlock(); }
我们知道在{}中创建的变量,变开这个大括号时就要销毁,于是就自动调用析构函数了。这个类容易理解,不过我特别喜欢它这种对规则的利用!
new Mutex(1);构造的是进程间使用的Mutex,它的类型是SHARED。一般是在线程中使用,所以你都看不到它调用构造函数,都是直接拿来用,比如这样:
Mutex::Autolock _l(mLock);
为了简化代码:
typedef Mutex::Autolock AutoMutex
我们使用Autolock的时候就可以在大括号内直接new一个AutoMutex对象就可以了。
它的用法也很简单,直接在一个大括号内AutoMutex xxx(mLock);或者是Mutex::Autolock xx(mLock);就行了。当然前提是mLock要初始化
工具类之Mutex的更多相关文章
- AQS 框架之 LockSupport 线程阻塞工具类
■ 前言 并发包一直是 JDK 里面比较难理解的,同时也是很精美的语言,膜拜下 Doug Li 大神.作者不敢长篇大论,只求循序渐进地把并发包通过理论和实战 (代码) 的方式介绍给大家. 其实做每一件 ...
- Collections工具类
Collections 是一个操作 Set.List 和 Map 等集合的工具类. Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变. ...
- Collections -- 集合的工具类
Collections是JDK针对集合提供的一个工具类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 1.搜索 如可以使用Collections提供的二分查找方法binarySe ...
- EAS常用工具类
package com.kingdee.eas.custom; import java.io.File; import java.io.FileNotFoundException; import ja ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- Android—关于自定义对话框的工具类
开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...
- [转]Java常用工具类集合
转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...
- js常用工具类.
一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...
- Guava库介绍之实用工具类
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...
随机推荐
- vue - 使用axios
1. 先安装axios 1.1 npm安装:npm i -D axios 1.2 yarn 安装:yarn add axios --dev 2. 配置main.js,在src目录下. 3. 使用
- The application is in break mode
在安装使用Visual Studio 2017后,当代码出现异常的时候,它没有调到代码出错的地方,显示了下图.. 解决办法:打开 Debug——>Options——>,勾上 Use Man ...
- Java设计模式(二)-单例模式
单例模式建议保证某个对象仅仅仅仅有一个实例,当仅仅有一个对象来协调整个系统的操作时,在计算机系统中.线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.总之,选择单例模式就是为了 ...
- Qt 5.3更新无数,更改C++控制台输出最为赞
迁移至 多色网
- java web 中的MVC
M:相当于Bean V:jsp C:servlet 当客户端发来请求,servlet响应请求处理请求,并把要发送给客户端的数据封装到Bean中,然后通过转发,将这个封装好了数据Bean送给jsp,js ...
- LibRec:一个实现推荐系统的Java库包
LibRec是一个用于实现推系统 RS 的Java库包,实现推荐系统的两个经典问题: rating prediction(评分排行预测) 和 item ranking (项目排行),其内置了经典的机器 ...
- vsCode 添加浏览器调试和js调试的方法总结
vsCode 添加浏览器调试和js调试的方法 1.直接按F5可以调试的方法或者点击运行按钮(可以直接运行html文件或者js文件) 在launch.json文件中的配置如下: { " ...
- 学习C#——性能计数器
写在前面: 作为Web应用开发前线的一枚小兵,每看到“性能”一词总有种要亮瞎眼的感觉,说到“性能”那就不能不提“数据”,在程序猿.攻城师中不是流行这样一句话吗?“无图无真相”,谁要说谁开发的应用性能有 ...
- 和求余运算巧妙结合的jns指令
.text:004A78B1 and eax, 80000001h.text:004A78B6 jns short loc_4A78BD.text:004A78B8 dec eax.text:00 ...
- python pivot() 函数
以下为python pandas 库的dataframe pivot()函数的官方文档: Reshape data (produce a “pivot” table) based on column ...