Mutex類使用Futex實現同步

2021-06-21 21:10:56 字數 1783 閱讀 5728

新書上市《深入解析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 查詢窗體的方式,還有就是 利...