Android中線程同步之Mutex與Condtion的用法

來源:互聯網
上載者:User
田海立
2013-08-10

Android封裝的同步類主要有MUTEX(AutoMutex)與Condition。本文分析如何使用他們,具體的實現參見《Android中線程同步之MUTEX與Condtion的實現》與《pthread之MUTEX與Condition用法》。
Keywords: Mutex, Condition Variable, AutoLock/AutoMutex, Android
關鍵字:互斥體、條件變數、自動鎖/自動互斥體、Android

一、MUTEX

看MUTEX的外部介面定義(聲明在frameworks/native/include/utils/Mutex.h中)
<圖1 TODO>

1.1 構造/析構
Mutex();Mutex(const char* name);Mutex(int type, const char* name = NULL);~Mutex();

建構函式的區別在於參數:
- name 是為MUTEX指定名字,如不指定,預設是NULL;
- type 是指定MUTEX的類型,有

    enum {        PRIVATE = 0,        SHARED = 1    };

兩種類型:PRIVATE是進程內部使用的;SHARED是適用於跨進程共用的。
如不指定,預設是PRIVATE的類型。

1.2 功能函數

MUTEX有下面三個主要的功能函數:

    status_t    lock();    void        unlock();    status_t    tryLock();

lock()    擷取鎖。如果擷取就返回,否則掛起等待;
unlock()  釋放鎖;
tryLock() 如果當前鎖可被擷取(未被別的線程擷取)就lock,否則也直接返回。傳回值:0代表成功;其它值失敗。與lock()的區別在於不論成功與否都會及時返回,而不是掛起等待。

線程在進入MUTEX保護的臨界區之前通過lock()擷取鎖,擷取鎖之後可以執行臨界區內的代碼,退出臨界區之後通過unlock釋放鎖。
某一時刻臨界區內至多隻有一個線程在執行,如果已有線程T1在執行,要進入臨界區的其它線程T2在執行lock()之後就會被掛起等待;直到線程T1釋放掉鎖之後,線程T2才能獲得鎖進入臨界區執行。

lock()/unlock()必須配合使用,tryLock()則要根據執行的結果有無獲得鎖而選擇是否unlock()。

1.3 典型情境
m_mutex.lock();// CRITICAL AREA,需要保護的內容m_mutex.unlock();

二、Condition

看Condition的外部介面定義(聲明在frameworks/native/include/utils/Condition.h中)
<圖2 TODO>

2.1 構造/析構
    Condition();    Condition(int type);    ~Condition();

建構函式的區別在於type參數:
- type 是指定Condition的類型,有

    enum {        PRIVATE = 0,        SHARED = 1    };

兩種類型:PRIVATE是進程內部使用的;SHARED是適用於跨進程共用的。
如不指定,預設是PRIVATE的類型。

2.2 功能函數

Condition有下面四個主要的功能函數:

    status_t wait(Mutex& mutex);    status_t waitRelative(Mutex& mutex, nsecs_t reltime);    void signal();    void broadcast();

wait() 等待條件變數(Condition Variable)
    Mutex作為參數,調用該函數之前該MUTEX必須已經被lock住。
    執行該函數,會unlock該MUTEX,並等待條件變數。如果不能獲得該條件變數,就被掛起等待;獲得了該條件變數,就重新lock住MUTEX並返回。而這些操作都是原子操作的。
    該函數執行之後,Mutex被重新lock住,所以執行函數之後,必須有Mutex的unlock操作。
waitRelative()與和wait()的區別是,會有一個等待逾時時間,到了時間沒有獲得該條件變數也會返回,可通過傳回值判斷結果。
signal()和broadcast() 觸發條件變數(Condition Variable)
    signal()和broadcast() 的區別是,signal()只允許等待該條件變數的一個線程獲得;broadcast()允許等待該條件變數的所有線程獲得並繼續執行。
    signal()和broadcast() 執行之前也必須lock住Mutex,執行之後unlock Mutex。

2.3 典型情境

線程T1的執行:

m_mutex.lock();   m_cond.wait(m_mutex);   m_mutex.unlock();

線程T1通過條件變數在等待某個條件的滿足。

線程T2執行:

m_mutex.lock();   m_cond.signal();   m_mutex.unlock();

線程T2在滿足條件之後,通過條件變數通知條件滿足。

三、Autolock/AutoMutex

Autolock是為了簡化Mutex的使用而定義的,它也定義在frameworks/native/include/utils/Mutex.h中,封裝了Mutex,並利用c++的構造與析構機制。

        Autolock(Mutex& mutex);        Autolock(Mutex* mutex);        ~Autolock();

用法很簡單,定義一個局部臨時的AutoMutex變數,在該變數定義的地方,建構函式被自動調用,會執行Mutex的lock()操作;在該變數範圍結束的地方,解構函式會被自動調用,會執行Mutex的unlock操作。
所以,可以在需要Mutex保護的地區開始的地方定義一個AutoMutex變數即可,即可實現用Mutex對該地區的保護。

四、總結

本文簡要介紹了Android中常用的同步機制Mutex(AutoMutex)、Condition的使用。後續文章(《Android中線程同步之MUTEX與Condtion的實現》與《pthread之MUTEX與Condition用法》)看它們是如何?的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.