1.1.1 Android中的同步与互斥
Android系统也提供了自己的同步互斥机制,不过任何技术的本质都是类似的,更多的是把这些本质的东西应用到符合自己要求的场景。目前Android封装的同步互斥类包括:
· Mutex
头文件在frameworks/native/include/utils/Mutex.h,因为实现与具体的平台有关,我们只关心如何使用它
· Condition
头文件在frameworks/native/include/utils/Condition.h,同样我们只是应用它
· Barrier
frameworks/native/services/surfaceflinger/Barrier.h
这是基于Mutex和Condition实现的一个模型,目前只被用于SurfaceFlinger中,我们在后续的章节会碰到
1.1.1.1 Mutex
Mutex类中有一个enum定义,如下:
class Mutex {
public:
enum {
PRIVATE = 0,
SHARED = 1
};
如果是SHARED的话,说明它是适用于跨进程共享的。比如AudioTrack与AudioFlinger就驻留在两个不同的进程,所以它们的mutex就是这种类型的:
/*frameworks/av/media/libmedia/AudioTrack.cpp*/
audio_track_cblk_t::audio_track_cblk_t()
: lock(Mutex::SHARED), cv(Condition::SHARED), user(0),server(0),
userBase(0),serverBase(0), buffers(NULL), frameCount(0),
loopStart(UINT_MAX),loopEnd(UINT_MAX), loopCount(0), mVolumeLR(0x10001000),
mSendLevel(0), flags(0)
{
}
Mutex类中有三个重要的成员函数:
status_t lock(); //获取资源锁
void unlock();//释放资源锁
status_t tryLock(); /*如果当前资源可用就lock,否则也直接返回,返回值0代表成功。可见它和lock()
的区别在于不论成功与否都会及时返回,而不是等待*/
它的构造函数有三个:
/*frameworks/native/include/utils/Mutex.h*/
inline Mutex::Mutex() {
pthread_mutex_init(&mMutex, NULL);
}
inline Mutex::Mutex(const char* name)