Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中線程同步之Mutex與Condtion的用法

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

編輯:關於Android編程

Android中線程同步之Mutex與Condtion的用法:一、MUTEX: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

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對該區域的保護。

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