Android封装的同步类主要有MUTEX(AutoMutex)与Condition。本文分析如何使用他们,具体的实现参见《Android中线程同步之MUTEX与Condtion的实现》与《pthread之MUTEX与Condition用法》。 Keywords: Mutex, Condition Variable, AutoLock/AutoMutex, Android 关键字:互斥体、条件变量、自动锁/自动互斥体、Android 一、MUTEX 看MUTEX的外部接口定义(声明在frameworks/native/include/utils/Mutex.h中) <图1 TODO> 1.1 构造/析构 cpp代码
- name 是为MUTEX指定名字,如不指定,缺省是NULL; - type 是指定MUTEX的类型,有 cpp代码
如不指定,缺省是PRIVATE的类型。 1.2 功能函数 MUTEX有下面三个主要的功能函数: cpp代码
unlock() 释放锁; tryLock() 如果当前锁可被获取(未被别的线程获取)就lock,否则也直接返回。返回值:0代表成功;其它值失败。与lock()的区别在于不论成功与否都会及时返回,而不是挂起等待。 线程在进入MUTEX保护的临界区之前通过lock()获取锁,获取锁之后可以执行临界区内的代码,退出临界区之后通过unlock释放锁。 某一时刻临界区内至多只有一个线程在执行,如果已有线程T1在执行,要进入临界区的其它线程T2在执行lock()之后就会被挂起等待;直到线程T1释放掉锁之后,线程T2才能获得锁进入临界区执行。 lock()/unlock()必须配合使用,tryLock()则要根据执行的结果有无获得锁而选择是否unlock()。 1.3 典型场景 cpp代码
看Condition的外部接口定义(声明在frameworks/native/include/utils/Condition.h中) <图2 TODO> 2.1 构造/析构 cpp代码
- type 是指定Condition的类型,有 cpp代码
如不指定,缺省是PRIVATE的类型。 2.2 功能函数 Condition有下面四个主要的功能函数: cpp代码
Mutex作为参数,调用该函数之前该MUTEX必须已经被lock住。 执行该函数,会unlock该MUTEX,并等待条件变量。如果不能获得该条件变量,就被挂起等待;获得了该条件变量,就重新lock住MUTEX并返回。而这些操作都是原子操作的。 该函数执行之后,Mutex被重新lock住,所以执行函数之后,必须有Mutex的unlock操作。 waitRelative()与和wait()的区别是,会有一个等待超时时间,到了时间没有获得该条件变量也会返回,可通过返回值判断结果。 signal()和broadcast() 触发条件变量(Condition Variable) signal()和broadcast() 的区别是,signal()只允许等待该条件变量的一个线程获得;broadcast()允许等待该条件变量的所有线程获得并继续执行。 signal()和broadcast() 执行之前也必须lock住Mutex,执行之后unlock Mutex。 2.3 典型场景 线程T1的执行: cpp代码
线程T2执行: cpp代码
三、Autolock/AutoMutex Autolock是为了简化Mutex的使用而定义的,它也定义在frameworks/native/include/utils/Mutex.h中,封装了Mutex,并利用c++的构造与析构机制。 cpp代码
所以,可以在需要Mutex保护的区域开始的地方定义一个AutoMutex变量即可,即可实现用Mutex对该区域的保护。 四、总结 本文简要介绍了Android中常用的同步机制Mutex(AutoMutex)、Condition的使用。后续文章(《Android中线程同步之MUTEX与Condtion的实现》与《pthread之MUTEX与Condition用法》)看它们是如何实现的。 原文链接:http://www./thread-16571-1-2.html |
|
来自: QCamera > 《performance》