工具类之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系列之一,主要介 ...
随机推荐
- 微信/易信公共平台开发(四):公众号调试器 (仿真微信平台,提供PHP源码)
开发微信/易信公共平台时,调试往往很麻烦,一般只能在手机上边试边改, 或在服务器写日志.当你的服务器脚本有Bug时,手机上没有显示,追查是不容易的.我在开发过程中,编写了一个调试器, 能仿真微信/易信 ...
- 去掉A标签的虚线框
outline是css3的一个属性,用的很少. 声明,这是个不能兼容的css属性,在ie6.ie7.遨游浏览器都不兼容. outline控制的到底是什么呢? 当聚焦a标签的时候,在a标签的区域周围会有 ...
- 非变动性算法源代码分析与使用示例( for_each、min_element 、find_if、search 等)
非变动性算法代码分析与示例: 一.for_each C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // TEMPLATE FUNCTION for_eac ...
- 文件流(fstream, ifstream, ofstream)的打开关闭、流状态
一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...
- java反射详解及说明
首先写一个Person类: package lltse.base.reflectdemo; public class Person { private String name ="张三&qu ...
- Android异步任务处理框架AsyncTask源代码分析
[转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比方最常见的网络请求).遇到这样的问题.我 ...
- HttpOperater
using System; using System.IO; using System.Linq; using System.Net; using System.Text; using System. ...
- 以源码编译的方式安装PHP与php-fpm
首先是最基本的下载,解压,编译安装(以PHP 5.3.6 为例): wget http://www.php.net/get/php-5.3.6.tar.gz/from/this/mirrortar x ...
- 去重mongodb LIST
using MongoDB; using DockSample.DB; using MongoDB.Driver; using System; using System.Collections.Gen ...
- 重装windows导致grub损坏
本人一块磁盘第7分区装linux,第一分区先装xp,后重装为windows8.1后,发现grub引导没了,直接进了windows,解决办法如下: 1.LiveCD进入系统,打开shell 2.输入sh ...