田海立
2013-08-10
Android封裝的同步類主要有MUTEX(AutoMutex)與Condition。前文分析了它們的外部使用,本文看它們是如何通過對pthread Mutex和Condition的封裝實現的。遇到pthread的用法,可結合《pthread之MUTEX與Condition用法》一起看。
Keywords: Mutex, Condition Variable, AutoLock/AutoMutex, Android
關鍵字:互斥體、條件變數、自動鎖/自動互斥體、Android
一、MUTEX的實現
MUTEX的實現是在frameworks/native/include/utils/Mutex.h中。
Mutex的實現利用了pthread Mutex的實現。
首先,Class Mutex內部定義一個pthread_mutex
pthread_mutex_t mMutex;
然後,分別封裝了pthread_mutex_xxx()而已:
inline Mutex::Mutex() { pthread_mutex_init(&mMutex, NULL);}inline Mutex::Mutex(const char* name) { pthread_mutex_init(&mMutex, NULL);}inline Mutex::Mutex(int type, const char* name) { if (type == SHARED) { pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); pthread_mutex_init(&mMutex, &attr); pthread_mutexattr_destroy(&attr); } else { pthread_mutex_init(&mMutex, NULL); }}inline Mutex::~Mutex() { pthread_mutex_destroy(&mMutex);}inline status_t Mutex::lock() { return -pthread_mutex_lock(&mMutex);}inline void Mutex::unlock() { pthread_mutex_unlock(&mMutex);}inline status_t Mutex::tryLock() { return -pthread_mutex_trylock(&mMutex);}
具體pthread Mutex的用法,參見《pthread之MUTEX與Condition用法》
二、Autolock/AutoMutex的實現
Autolock/AutoMutex的實現同樣是在frameworks/native/include/utils/Mutex.h中。
namespace android {class Mutex { //... class Autolock { public: inline Autolock(Mutex& mutex) : mLock(mutex) { mLock.lock(); } inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); } inline ~Autolock() { mLock.unlock(); } private: Mutex& mLock; };}; // end of class Mutextypedef Mutex::Autolock AutoMutex;}; // namespace android
三、Condition的實現
Condition的實現是在frameworks/native/include/utils/Condition.h中
Condition的實現利用了pthread Condition的實現。
首先,Class Condition內定義一個pthread_cond
pthread_cond_t mCond;
然後,分別封裝了pthread_cond_xxx()而已:
inline Condition::Condition() { pthread_cond_init(&mCond, NULL);}inline Condition::Condition(int type) { if (type == SHARED) { pthread_condattr_t attr; pthread_condattr_init(&attr); pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); pthread_cond_init(&mCond, &attr); pthread_condattr_destroy(&attr); } else { pthread_cond_init(&mCond, NULL); }}inline Condition::~Condition() { pthread_cond_destroy(&mCond);}inline status_t Condition::wait(Mutex& mutex) { return -pthread_cond_wait(&mCond, &mutex.mMutex);}inline void Condition::signal() { pthread_cond_signal(&mCond);}inline void Condition::broadcast() { pthread_cond_broadcast(&mCond);}
具體pthread Condition的用法,參見《pthread之MUTEX與Condition用法》
四、總結
本文簡要介紹了Android中常用的同步機制Mutex(AutoMutex)、Condition的內部實現,也就是對pthread Mutex和Condition的簡單封裝。《pthread之MUTEX與Condition用法》中介紹pthread中Mutex與Condition的用法。