工具类之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系列之一,主要介 ...
随机推荐
- POJ1035
#include <iostream> #include <cstdio> #include <cstring> #include <vector> # ...
- javaWeb注册,登陆,注销功能的实现
一:注册页面:regist.jsp: <%@ page language="java" contentType="text/html; charset=UTF-8& ...
- QtGui.QPen
The QtGui.QPen is an elementary graphics object. It is used to draw lines, curves and outlines of re ...
- JavaScript操作符
一元操作符 只能操作一个值的操作符叫做一元操作符. 递增和递减操作符 递增和递减操作符遵循下列规则: 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作 ...
- sql通过某个字段名找到数据库中对应的表
sql通过某个字段名找到数据库中对应的表 SELECT sb.name FROM syscolumns s JOIN sysobjects sb ON s.id=sb.id WHERE s.name= ...
- 转:sock_ev——linux平台socket事件框架(基于数据报的测试程序) .
上一篇已经做过注释,这一篇直接上代码 /******************************************************************************** ...
- 【Leet Code】Palindrome Number
Palindrome Number Total Accepted: 19369 Total Submissions: 66673My Submissions Determine whether an ...
- 【微信小程序】request请求POST提交数据,记得要加上header
wx.request({ url: '*******', data: { "type":"nearest_village", "district&qu ...
- C# 基础: new 和 overrider 的区别
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 彻底清除Linux centos minerd木马 实战 跟redis的设置有关
top -c把cpu占用最多的进程找出来: Tasks: total, running, sleeping, stopped, zombie Cpu(s): 72.2%us, 5.9%sy, 0.0% ...