編輯:關於Android編程
Android C++中的線程同步主要就是對pthread的mutex和condition的封裝。所以學習之前,建議先了解一個標准C++中線程同步的實現,參考鏈接:C++ 中線程學習
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僅僅是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的機制有點類似於智能指針,都是很好的運用了類的構造函數和析構函數進行一些特定的操作。
前言因為最近想和後台進行對接,昨天自己在Google上研究了半天關於Volley的內容,覺得很開心。因為原來覺得關於網絡這塊,一直是個很復雜的東西和流程,沒想到Googl
最近做的項目是和語音實時采集並發送,對方實時接收並播放相關,下面記錄下實現的核心代碼。 很多Android開發者應該知道android有個MediaRecorder對象和
通知機制 是Android和用戶交互,提高APP活躍度的重要手段,可以將一些重要的信息通過通知展示給用戶,比如說新的聊天消息或者日歷事件。Notification的設計理
1.這篇博文不算什麼知識點。使用的都是的系統中已經提供給我們的方式方法。這是最近用到了,感覺很實用,特此貢獻出來。 首先需要定義,listview中需要展示的