Android C++中線程同步實現,android線程
前言
Android C++中的線程同步主要就是對pthread的mutex和condition的封裝。所以學習之前,建議先瞭解一個標準C++中線程同步的實現,參考連結:C++ 中線程學習
Mutex
Android Mutex的實現源碼位於/system/core/include/utils/Mutex.h,我們先來看一下Mutex類的具體實現:
class Mutex {public: enum { PRIVATE = 0, SHARED = 1 }; Mutex(); Mutex(const char* name); Mutex(int type, const char* name = NULL); ~Mutex(); // lock or unlock the mutex status_t lock(); void unlock(); // lock if possible; returns 0 on success, error otherwise status_t tryLock(); 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; };private: pthread_mutex_t mMutex;};
從標頭檔中,我們發現Mutex類private變數mMutex是我們熟悉的phread_mutex_t類型,pthread_mutex_lock和pthread_mutex_unlock函數通過通過此變數保證一系列操作的原子性。
接下來,我們看一下Mutex類建構函式、解構函式、lock、unlock和tryLock的具體實現(在看源碼之前,我們應該能猜到你們就是對pthread _mutex_xxx函數的簡單封裝):
inline Mutex::Mutex() { // 建構函式,初始化mMutex變數 pthread_mutex_init(&mMutex, NULL);}inline Mutex::~Mutex() { // 解構函式,就是銷毀mMutex變數 pthread_mutex_destory(&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);}
僅僅是這種簡單封裝,還不能滿足Android設計者偷懶的心理。而且我們在Android源碼中大量的看到類似於:
AutoMutex _l(gProcessMutex);
這樣的寫法,並沒有看到Mutex::lock()和Mutex::unlock()的顯示調用。所以,接下來,我們繼續學習AutoMutex基於Mutex類的實現。
AutoMutex
AutoMutex僅僅是typedef的重新命名,源碼如下:
typedef Mutex::Autolock AutoMutex;
而Mutex::Autolock是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;};
可以看到,Autolock內部類在建構函式中調用了Mutex類的lock方法,在解構函式中調用了Mutex類的unlock方法。所以當我們在一個函數塊中調用AutoMutex的時候:
Mutex gProcessMutex;void testAutoMutex() { AutoMutex _l(gProcessMutex); // 下面是需要同步的代碼內容 // ...}
我們定義了一個AutoMutex的變數_l,並把Mutex類型的變數gProcessMutex賦值給_l進行建構函式初始化,自然也實現了調用gProcessMutex的lock方法,實現了線程鎖機制。
當函數執行完畢後,AutoMutex的解構函式被調用,從而調用了gProcessMutex的unlock方法,釋放了線程鎖機制。
其實,AutoMutex的機制有點類似於智能指標,都是很好的運用了類的建構函式和解構函式進行一些特定的操作。