Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android C++中線程同步實現

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的機制有點類似於智能指針,都是很好的運用了類的構造函數和析構函數進行一些特定的操作。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved