新書上市《深入解析android 5.0系統》
以下內容節選自本書
下面我們將通過乙個實際的例子來進一步的了解
futex
的用法。前面我們介紹
bionic
中的執行緒管理時介紹了
pthread
的臨界區函式。臨界區的實現中最重要的是上鎖和解鎖函式,下面我們看看它們的實現:1.在
bionic
的實現中,
pthread_mutex_lock()
呼叫了內部函式
_normal_lock()
來實現上鎖功能,**如下:
static__inline__ void _normal_lock(pthread_mutex_t*
mutex, intshared)
android_membar_full();
}_normal_lock()
函式呼叫原子操作函式
__bionic_cmpxchg()
來檢測mutex->value
的值是否等於
unlocked
變數的值(
unlocked
代表未鎖定的狀態),如果相等則將
mutex->value
的值設定為
locked_uncontended
變數的值(表示鎖定但是沒有競爭的狀態)。
__bionic_cmpxchg()
函式在mutex->value
不等於unlocked
的情況下會返回非
0,這樣就進入
if語句內執行。
__bionic_swap()
函式會將
mutex->value
的值設為
locked_contended
(表示有競爭),同時返回
mutex->value
原來的值。如果
mutex->value
原來的值不等於
unlocked
則呼叫函式
__futex_wait_ex()
掛起執行緒等待。這裡使用
while
迴圈是因為可能有多個執行緒在等待,即使從掛起狀態恢復後也可能還是搶不到鎖,所以要重新進入等待狀態。
2.pthread_mutex_unlock()
則呼叫了內部函式
_normal_unlock()
來實現解鎖功能。**如下所示:
static__inline__ void _normal_unlock(pthread_mutex_t*
mutex, intshared)
}解鎖時首先使用
__bionic_atomic_dec()
函式對mutex->value
執行減一操作,函式
__bionic_atomic_dec()
將返回mutex->value
原來的值。如果
mutex->value
原來的值不是
「鎖定但是無競爭
」的狀態,也就意味著還有執行緒在等待,所以要呼叫
__futex_wake_ex()
來喚醒等待的執行緒。
從mutex
的實現**中我們應該能體會到
futex
的優點,如果多個執行緒訪問臨界區的時間是錯開的,也就是沒有真正的競爭發生,那麼實際上是不會產生系統呼叫的。
當然如果多個執行緒在競爭臨界區的鎖,還是一樣會有掛起和喚醒的系統呼叫。這種情況下
futex
的效率和以前的實現就沒有區別了。
關於使用Mutex類來實現執行緒同步
using system using system.threading namespace threaddemo mutex else 當主程式啟動時,定義了乙個指定名稱的互斥量,設定initialowner標誌為false。這意味著如果互斥量已經被建立,則允許程式獲取該互斥量。如果沒有獲取該互斥量...
使用Mutex實現程式單例項執行 c
大家在開發程式的時候,有時需要限制程式,只能同時執行乙個例項,實現此功能,對於vb.net是非常容易的,只要指定乙個屬性即可,但是c 實現起來,就稍微繁瑣了。c 實現單例項執行的方法,也有多種,比如利用 process 查詢程序的方式,利用 api findwindow 查詢窗體的方式,還有就是 利...
使用Mutex實現程式單例項執行 c
大家在開發程式的時候,有時需要限制程式,只能同時執行乙個例項,實現此功能,對於vb.net是非常容易的,只要指定乙個屬性即可,但是c 實現起來,就稍微繁瑣了。c 實現單例項執行的方法,也有多種,比如利用 process 查詢程序的方式,利用 api findwindow 查詢窗體的方式,還有就是 利...