編輯:關於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、gradle導入jar包的特點:(和libs文件夾導入jar包的區別)gradle導入jar包更方便,一行代碼即可搞定。不像後者那樣還要自己去官方下載。如果官方將ja
最近在翻以前寫的代碼,翻到幾個月以前做的一個仿雷達掃描的效果,現在拿出來和大家分享一下,在進入分析和代碼之前,我們先來看看效果吧,…錄屏質量較差,湊活著看吧
線程是一個動態執行的過程,從產生到死亡包括五個狀態:新建、就緒、運行、死亡和堵塞。只要線程沒有執行完畢或者沒有被其它線程殺死,線程就不會進入死亡狀態。Android中的
一、首先說明:藍牙通信必須用手機測試,因為avd裡沒有相關的硬件,會報錯! 好了,看看最後的效果圖: 二、概述: 1.判斷是否支持BluetoothBluet