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的更多相关文章

  1. AQS 框架之 LockSupport 线程阻塞工具类

    ■ 前言 并发包一直是 JDK 里面比较难理解的,同时也是很精美的语言,膜拜下 Doug Li 大神.作者不敢长篇大论,只求循序渐进地把并发包通过理论和实战 (代码) 的方式介绍给大家. 其实做每一件 ...

  2. Collections工具类

    Collections 是一个操作 Set.List 和 Map 等集合的工具类. Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变. ...

  3. Collections -- 集合的工具类

    Collections是JDK针对集合提供的一个工具类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 1.搜索 如可以使用Collections提供的二分查找方法binarySe ...

  4. EAS常用工具类

    package com.kingdee.eas.custom; import java.io.File; import java.io.FileNotFoundException; import ja ...

  5. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  6. Android—关于自定义对话框的工具类

    开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...

  7. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

  8. js常用工具类.

    一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...

  9. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

随机推荐

  1. 微信/易信公共平台开发(四):公众号调试器 (仿真微信平台,提供PHP源码)

    开发微信/易信公共平台时,调试往往很麻烦,一般只能在手机上边试边改, 或在服务器写日志.当你的服务器脚本有Bug时,手机上没有显示,追查是不容易的.我在开发过程中,编写了一个调试器, 能仿真微信/易信 ...

  2. 去掉A标签的虚线框

    outline是css3的一个属性,用的很少. 声明,这是个不能兼容的css属性,在ie6.ie7.遨游浏览器都不兼容. outline控制的到底是什么呢? 当聚焦a标签的时候,在a标签的区域周围会有 ...

  3. 非变动性算法源代码分析与使用示例( 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 ...

  4. 文件流(fstream, ifstream, ofstream)的打开关闭、流状态

    一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...

  5. java反射详解及说明

    首先写一个Person类: package lltse.base.reflectdemo; public class Person { private String name ="张三&qu ...

  6. Android异步任务处理框架AsyncTask源代码分析

    [转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比方最常见的网络请求).遇到这样的问题.我 ...

  7. HttpOperater

    using System; using System.IO; using System.Linq; using System.Net; using System.Text; using System. ...

  8. 以源码编译的方式安装PHP与php-fpm

    首先是最基本的下载,解压,编译安装(以PHP 5.3.6 为例): wget http://www.php.net/get/php-5.3.6.tar.gz/from/this/mirrortar x ...

  9. 去重mongodb LIST

    using MongoDB; using DockSample.DB; using MongoDB.Driver; using System; using System.Collections.Gen ...

  10. 重装windows导致grub损坏

    本人一块磁盘第7分区装linux,第一分区先装xp,后重装为windows8.1后,发现grub引导没了,直接进了windows,解决办法如下: 1.LiveCD进入系统,打开shell 2.输入sh ...