在編程中,引入了對象互斥鎖的概念,來保證共享數據操做的完整性。每一個對象都對應於一個可稱爲" 互斥鎖" 的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。linux
中文名編程
互斥鎖安全
領 域併發
彙編語言異步
下面舉例:ide
在Posix Thread中定義有一套專門用於線程同步的mutex函數。函數
1. 建立和銷燬測試
有兩種方法建立互斥鎖,靜態方式和動態方式。POSIX定義了一個宏PTHREAD_MUTEX_INITIALIZER來靜態初始化互斥鎖,方法以下: pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在LinuxThreads實現中,pthread_mutex_t是一個結構,而PTHREAD_MUTEX_INITIALIZER則是一個結構常量。url
動態方式是採用pthread_mutex_init()函數來初始化互斥鎖,API定義以下: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) 其中mutexattr用於指定互斥鎖屬性(見下),若是爲NULL則使用缺省屬性。線程
pthread_mutex_destroy ()用於註銷一個互斥鎖,API定義以下: int pthread_mutex_destroy(pthread_mutex_t *mutex) 銷燬一個互斥鎖即意味着釋放它所佔用的資源,且要求鎖當前處於開放狀態。因爲在Linux中,互斥鎖並不佔用任何資源,所以LinuxThreads中的 pthread_mutex_destroy()除了檢查鎖狀態之外(鎖定狀態則返回EBUSY)沒有其餘動做。
2. 互斥鎖屬性
互斥鎖的屬性在建立鎖的時候指定,在LinuxThreads實現中僅有一個鎖類型屬性,不一樣的鎖類型在試圖對一個已經被鎖定的互斥鎖加鎖時表現不一樣。當前(glibc2.2.3,linuxthreads0.9)有四個值可供選擇:
* PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當一個線程加鎖之後,其他請求鎖的線程將造成一個等待隊列,並在解鎖後按優先級得到鎖。這種鎖策略保證了資源分配的公平性。
* PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,容許同一個線程對同一個鎖成功得到屢次,並經過屢次unlock解鎖。若是是不一樣線程請求,則在加鎖線程解鎖時從新競爭。
* PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,若是同一個線程請求同一個鎖,則返回EDEADLK,不然與PTHREAD_MUTEX_TIMED_NP類型動做相同。這樣就保證當不容許屢次加鎖時不會出現最簡單狀況下的死鎖。
* PTHREAD_MUTEX_ADAPTIVE_NP,適應鎖,動做最簡單的鎖類型,僅等待解鎖後從新競爭。
3.鎖操做
鎖操做主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試加鎖 pthread_mutex_trylock()三個,不論哪一種類型的鎖,都不可能被兩個不一樣的線程同時獲得,而必須等待解鎖。對於普通鎖和適應鎖類型,解鎖者能夠是同進程內任何線程;而檢錯鎖則必須由加鎖者解鎖纔有效,不然返回EPERM;對於嵌套鎖,文檔和實現要求必須由加鎖者解鎖,但實驗結果代表並無這種限制,這個不一樣尚未獲得解釋。在同一進程中的線程,若是加鎖後沒有解鎖,則任何其餘線程都沒法再得到鎖。
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
pthread_mutex_trylock()語義與pthread_mutex_lock()相似,不一樣的是在鎖已經被佔據時返回EBUSY而不是掛起等待。
4. 其餘
POSIX 線程鎖機制的Linux實現都不是取消點,所以,延遲取消類型的線程不會因收到取消信號而離開加鎖等待。值得注意的是,若是線程在加鎖後解鎖前被取消,鎖將永遠保持鎖定狀態,所以若是在關鍵區段內有取消點存在,或者設置了異步取消類型,則必須在退出回調函數中解鎖。
這個鎖機制同時也不是異步信號安全的,也就是說,不該該在信號處理過程當中使用互斥鎖,不然容易形成死鎖。
互斥鎖屬性使用互斥鎖(互斥)可使線程按順序執行。一般,互斥鎖經過確保一次只有一個線程執行代碼的臨界段來同步多個線程。互斥鎖還能夠保護單線程代碼。
要更改缺省的互斥鎖屬性,能夠對屬性對象進行聲明和初始化。一般,互斥鎖屬性會設置在應用程序開頭的某個位置,以即可以快速查找和輕鬆修改。表 4–1列出了用來處理互斥鎖屬性的函數。
表 4–1 互斥鎖屬性例程
操做 |
相關函數說明 |
初始化互斥鎖屬性對象 |
pthread_mutexattr_init 語法 |
銷燬互斥鎖屬性對象 |
pthread_mutexattr_destroy 語法 |
設置互斥鎖範圍 |
pthread_mutexattr_setpshared 語法 |
獲取互斥鎖範圍 |
pthread_mutexattr_getpshared 語法 |
設置互斥鎖的類型屬性 |
pthread_mutexattr_settype 語法 |
獲取互斥鎖的類型屬性 |
pthread_mutexattr_gettype 語法 |
設置互斥鎖屬性的協議 |
pthread_mutexattr_setprotocol 語法 |
獲取互斥鎖屬性的協議 |
pthread_mutexattr_getprotocol 語法 |
設置互斥鎖屬性的優先級上限 |
pthread_mutexattr_setprioceiling 語法 |
獲取互斥鎖屬性的優先級上限 |
pthread_mutexattr_getprioceiling 語法 |
設置互斥鎖的優先級上限 |
pthread_mutex_setprioceiling 語法 |
獲取互斥鎖的優先級上限 |
pthread_mutex_getprioceiling 語法 |
設置互斥鎖的強健屬性 |
pthread_mutexattr_setrobust_np 語法 |
獲取互斥鎖的強健屬性 |
pthread_mutexattr_getrobust_np 語法 |
表 4–2中顯示了在定義互斥範圍時 Solaris 線程和 POSIX 線程之間的差別。
表 4–2 互斥鎖範圍比較
Solaris |
POSIX |
定義 |
USYNC_PROCESS |
PTHREAD_PROCESS_SHARED |
用於同步該進程和其餘進程中的線程 |
USYNC_PROCESS_ROBUST |
無 POSIX 等效項 |
用於在進程間可靠地同步線程 |
USYNC_THREAD |
PTHREAD_PROCESS_PRIVATE |
用於僅同步該進程中的線程 |
使用pthread_mutexattr_init(3C)能夠將與互斥鎖對象相關聯的屬性初始化爲其缺省值。在執行過程當中,線程系統會爲每一個屬性對象分配存儲空間。
pthread_mutexattr_init 語法
int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
#include <pthread.h>
pthread_mutexattr_t mattr;
int ret;/* initialize an attribute to default value */
ret = pthread_mutexattr_init(&mattr);
調用此函數時,pshared 屬性的缺省值爲 PTHREAD_PROCESS_PRIVATE。該值表示能夠在進程內使用通過初始化的互斥鎖。
mattr 的類型爲 opaque,其中包含一個由系統分配的屬性對象。mattr 範圍可能的值爲 PTHREAD_PROCESS_PRIVATE 和 PTHREAD_PROCESS_SHARED。PTHREAD_PROCESS_PRIVATE 是缺省值。
對於互斥鎖屬性對象,必須首先經過調用 pthread_mutexattr_destroy(3C) 將其銷燬,才能從新初始化該對象。pthread_mutexattr_init()調用會致使分配類型爲 opaque 的對象。若是未銷燬該對象,則會致使內存泄漏。
ENOMEM
描述:內存不足,沒法初始化互斥鎖屬性對象。
pthread_mutexattr_destroy(3C)可用來取消分配用於維護pthread_mutexattr_init()所建立的屬性對象的存儲空間。
pthread_mutexattr_destroy 語法
int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr)#include <pthread.h>pthread_mutexattr_t mattr;int ret;/* destroy an attribute */ret = pthread_mutexattr_destroy(&mattr);
pthread_mutexattr_destroy 返回值
pthread_mutexattr_destroy()成功完成以後會返回零。其餘任何返回值都表示出現了錯誤。若是出現如下狀況,該函數將失敗並返回對應的值。
EINVAL
描述:由 mattr 指定的值無效。
pthread_mutexattr_setpshared(3C)可用來設置互斥鎖變量的做用域。
pthread_mutexattr_setpshared 語法
int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared);
#include <pthread.h>
pthread_mutexattr_t mattr;
int ret;
ret = pthread_mutexattr_init(&mattr);/* * resetting to its default value: private */
ret = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE);
互斥鎖變量能夠是進程專用的(進程內)變量,也能夠是系統範圍內的(進程間)變量。要在多個進程中的線程之間共享互斥鎖,能夠在共享內存中建立互斥鎖,並將pshared屬性設置爲 PTHREAD_PROCESS_SHARED。 此行爲與最初的 Solaris 線程實現中mutex_init()中的 USYNC_PROCESS 標誌等效。
若是互斥鎖的pshared屬性設置爲 PTHREAD_PROCESS_PRIVATE,則僅有那些由同一個進程建立的線程纔可以處理該互斥鎖。
pthread_mutexattr_getpshared(3C)可用來返回由pthread_mutexattr_setpshared()定義的互斥鎖變量的範圍。
pthread_mutexattr_getpshared 語法
int pthread_mutexattr_getpshared(pthread_mutexattr_t *mattr, int *pshared);#include <pthread.h>pthread_mutexattr_t mattr;int pshared, ret;/* get pshared of mutex */ret = pthread_mutexattr_getpshared(&mattr, &pshared); 此函數可爲屬性對象 mattr 獲取 pshared 的當前值。該值爲 PTHREAD_PROCESS_SHARED 或 PTHREAD_PROCESS_PRIVATE。
pthread_mutexattr_settype(3C)可用來設置互斥鎖的type屬性。
pthread_mutexattr_settype 語法
#include <pthread.h>int pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type);類型屬性的缺省值爲 PTHREAD_MUTEX_DEFAULT。
type參數指定互斥鎖的類型。如下列出了有效的互斥鎖類型:
PTHREAD_MUTEX_NORMAL
描述:此類型的互斥鎖不會檢測死鎖。若是線程在不首先解除互斥鎖的狀況下嘗試從新鎖定該互斥鎖,則會產生死鎖。嘗試解除由其餘線程鎖定的互斥鎖會產生不肯定的行爲。若是嘗試解除鎖定的互斥鎖未鎖定,則會產生不肯定的行爲。
PTHREAD_MUTEX_ERRORCHECK
描述:此類型的互斥鎖可提供錯誤檢查。若是線程在不首先解除鎖定互斥鎖的狀況下嘗試從新鎖定該互斥鎖,則會返回錯誤。若是線程嘗試解除鎖定的互斥鎖已經由其餘線程鎖定,則會返回錯誤。若是線程嘗試解除鎖定的互斥鎖未鎖定,則會返回錯誤。
PTHREAD_MUTEX_RECURSIVE
描述:若是線程在不首先解除鎖定互斥鎖的狀況下嘗試從新鎖定該互斥鎖,則可成功鎖定該互斥鎖。 與 PTHREAD_MUTEX_NORMAL 類型的互斥鎖不一樣,對此類型互斥鎖進行從新鎖定時不會產生死鎖狀況。屢次鎖定互斥鎖須要進行相同次數的解除鎖定才能夠釋放該鎖,而後其餘線程才能獲取該互斥鎖。若是線程嘗試解除鎖定的互斥鎖已經由其餘線程鎖定,則會返回錯誤。 若是線程嘗試解除鎖定的互斥鎖未鎖定,則會返回錯誤。
PTHREAD_MUTEX_DEFAULT
描述:若是嘗試以遞歸方式鎖定此類型的互斥鎖,則會產生不肯定的行爲。對於不是由調用線程鎖定的此類型互斥鎖,若是嘗試對它解除鎖定,則會產生不肯定的行爲。對於還沒有鎖定的此類型互斥鎖,若是嘗試對它解除鎖定,也會產生不肯定的行爲。容許在實現中將該互斥鎖映射到其餘互斥鎖類型之一。對於 Solaris 線程,PTHREAD_PROCESS_DEFAULT 會映射到 PTHREAD_PROCESS_NORMAL。
pthread_mutexattr_settype 返回值
若是運行成功,pthread_mutexattr_settype 函數會返回零。不然,將返回用於指明錯誤的錯誤號。
EINVAL
描述:值爲type無效。
EINVAL
描述:attr指定的值無效。
pthread_mutexattr_gettype(3C)可用來獲取由pthread_mutexattr_settype()設置的互斥鎖的type屬性。
pthread_mutexattr_gettype 語法
#include <pthread.h>int pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type);類型屬性的缺省值爲 PTHREAD_MUTEX_DEFAULT。
type參數指定互斥鎖的類型。有效的互斥鎖類型包括:
PTHREAD_MUTEX_NORMAL
PTHREAD_MUTEX_ERRORCHECK
PTHREAD_MUTEX_RECURSIVE
PTHREAD_MUTEX_DEFAULT
有關每種類型的說明,請參見pthread_mutexattr_settype 語法。
pthread_mutexattr_gettype 返回值
若是成功完成,pthread_mutexattr_gettype()會返回 0。其餘任何返回值都表示出現了錯誤。
pthread_mutexattr_setprotocol(3C)可用來設置互斥鎖屬性對象的協議屬性。
pthread_mutexattr_setprotocol 語法
#include <pthread.h>int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol);attr 指示之前調用pthread_mutexattr_init()時建立的互斥鎖屬性對象。
protocol 可定義應用於互斥鎖屬性對象的協議。
pthread.h 中定義的 protocol 能夠是如下值之一:PTHREAD_PRIO_NONE、PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT。
PTHREAD_PRIO_NONE
線程的優先級和調度不會受到互斥鎖擁有權的影響。
PTHREAD_PRIO_INHERIT
此協議值(如 thrd1)會影響線程的優先級和調度。若是更高優先級的線程因 thrd1 所擁有的一個或多個互斥鎖而被阻塞,而這些互斥鎖是用 PTHREAD_PRIO_INHERIT 初始化的,則 thrd1 將以高於它的優先級或者全部正在等待這些互斥鎖(這些互斥鎖是 thrd1 指所擁有的互斥鎖)的線程的最高優先級運行。
若是 thrd1 因另外一個線程 (thrd3) 擁有的互斥鎖而被阻塞,則相同的優先級繼承效應會以遞歸方式傳播給 thrd3。
使用 PTHREAD_PRIO_INHERIT 能夠避免優先級倒置。低優先級的線程持有較高優先級線程所需的鎖時,便會發生優先級倒置。只有在較低優先級的線程釋放該鎖以後,較高優先級的線程才能繼續使用該鎖。設置 PTHREAD_PRIO_INHERIT,以便按與預期的優先級相反的優先級處理每一個線程。
若是爲使用協議屬性值 PTHREAD_PRIO_INHERIT 初始化的互斥鎖定義了 _POSIX_THREAD_PRIO_INHERIT,則互斥鎖的屬主失敗時會執行如下操做。屬主失敗時的行爲取決於pthread_mutexattr_setrobust_np()的 robustness 參數的值。
解除鎖定互斥鎖。
互斥鎖的下一個屬主將獲取該互斥鎖,並返回錯誤 EOWNERDEAD。
互斥鎖的下一個屬主會嘗試使該互斥鎖所保護的狀態一致。若是上一個屬主失敗,則狀態可能會不一致。若是屬主成功使狀態保持一致,則可針對該互斥鎖調用pthread_mutex_init()並解除鎖定該互斥鎖。
注 –若是針對之前初始化的但還沒有銷燬的互斥鎖調用pthread_mutex_init(),則該互斥鎖不會從新初始化。
若是屬主沒法使狀態保持一致,請勿調用pthread_mutex_init(),而是解除鎖定該互斥鎖。在這種狀況下,全部等待的線程都將被喚醒。之後對pthread_mutex_lock()的全部調用將沒法獲取互斥鎖,並將返回錯誤代碼 ENOTRECOVERABLE。如今,經過調用pthread_mutex_destroy()來取消初始化該互斥鎖,便可使其狀態保持一致。調用pthread_mutex_init()可從新初始化互斥鎖。
若是已獲取該鎖的線程失敗並返回 EOWNERDEAD,則下一個屬主將獲取該鎖及錯誤代碼 EOWNERDEAD。
PTHREAD_PRIO_PROTECT
當線程擁有一個或多個使用 PTHREAD_PRIO_PROTECT 初始化的互斥鎖時,此協議值會影響其餘線程(如 thrd2)的優先級和調度。thrd2 以其較高的優先級或者以 thrd2 擁有的全部互斥鎖的最高優先級上限運行。基於被 thrd2 擁有的任一互斥鎖阻塞的較高優先級線程對於 thrd2 的調度沒有任何影響。
若是某個線程調用sched_setparam()來更改初始優先級,則調度程序不會採用新優先級將該線程移到調度隊列末尾。
線程擁有使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 初始化的互斥鎖
線程解除鎖定使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 初始化的互斥鎖
一個線程能夠同時擁有多個混合使用 PTHREAD_PRIO_INHERIT 和 PTHREAD_PRIO_PROTECT 初始化的互斥鎖。在這種狀況下,該線程將以經過其中任一協議獲取的最高優先級執行。
pthread_mutexattr_setprotocol 返回值
若是成功完成,pthread_mutexattr_setprotocol()會返回 0。其餘任何返回值都表示出現了錯誤。
若是出現如下任一狀況,pthread_mutexattr_setprotocol()將失敗並返回對應的值。
ENOSYS
描述:選項 _POSIX_THREAD_PRIO_INHERIT 和 _POSIX_THREAD_PRIO_PROTECT 均未定義而且該實現不支持此函數。
ENOTSUP
描述:protocol 指定的值不受支持。
若是出現如下任一狀況,pthread_mutexattr_setprotocol()可能會失敗並返回對應的值。
EINVAL
描述:attr 或 protocol 指定的值無效。
EPERM
描述:調用方無權執行該操做。
pthread_mutexattr_getprotocol(3C)可用來獲取互斥鎖屬性對象的協議屬性。
pthread_mutexattr_getprotocol 語法
#include <pthread.h>int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *attr, int *protocol);attr 指示之前調用pthread_mutexattr_init()時建立的互斥鎖屬性對象。
protocol 包含如下協議屬性之一:PTHREAD_PRIO_NONE、PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT。
pthread_mutexattr_getprotocol 返回值
若是成功完成,pthread_mutexattr_getprotocol()會返回 0。其餘任何返回值都表示出現了錯誤。
若是出現如下狀況,pthread_mutexattr_getprotocol()將失敗並返回對應的值。
ENOSYS
描述:_POSIX_THREAD_PRIO_INHERIT 選項和 _POSIX_THREAD_PRIO_PROTECT 選項均未定義而且該實現不支持此函數。
若是出現如下任一狀況,pthread_mutexattr_getprotocol()可能會失敗並返回對應的值。
EINVAL
描述:attr 指定的值無效。
EPERM
描述:調用方無權執行該操做。
pthread_mutexattr_setprioceiling(3C)可用來設置互斥鎖屬性對象的優先級上限屬性。
pthread_mutexattr_setprioceiling 語法
#include <pthread.h>int pthread_mutexattr_setprioceiling(pthread_mutexatt_t *attr, int prioceiling, int *oldceiling);attr 指示之前調用pthread_mutexattr_init()時建立的互斥鎖屬性對象。
prioceiling 指定已初始化互斥鎖的優先級上限。優先級上限定義執行互斥鎖保護的臨界段時的最低優先級。prioceiling 位於 SCHED_FIFO 所定義的優先級的最大範圍內。要避免優先級倒置,請將 prioceiling 設置爲高於或等於可能會鎖定特定互斥鎖的全部線程的最高優先級。
oldceiling 包含之前的優先級上限值。
pthread_mutexattr_setprioceiling 返回值
若是成功完成,pthread_mutexattr_setprioceiling()會返回 0。其餘任何返回值都表示出現了錯誤。
若是出現如下任一狀況,pthread_mutexattr_setprioceiling()將失敗並返回對應的值。
ENOSYS
描述:選項 _POSIX_THREAD_PRIO_PROTECT 未定義而且該實現不支持此函數。
若是出現如下任一狀況,pthread_mutexattr_setprioceiling()可能會失敗並返回對應的值。
EINVAL
描述:attr 或 prioceiling 指定的值無效。
EPERM
描述:調用方無權執行該操做。
pthread_mutexattr_getprioceiling(3C)可用來獲取互斥鎖屬性對象的優先級上限屬性。
pthread_mutexattr_getprioceiling 語法
#include <pthread.h>int pthread_mutexattr_getprioceiling(const pthread_mutexatt_t *attr, int *prioceiling);attr 指定之前調用pthread_mutexattr_init()時建立的屬性對象。
注 –
僅當定義了 _POSIX_THREAD_PRIO_PROTECT 符號時,attr 互斥鎖屬性對象纔會包括優先級上限屬性。
pthread_mutexattr_getprioceiling()返回 prioceiling 中已初始化互斥鎖的優先級上限。優先級上限定義執行互斥鎖保護的臨界段時的最低優先級。prioceiling 位於 SCHED_FIFO 所定義的優先級的最大範圍內。要避免優先級倒置,請將 prioceiling 設置爲高於或等於可能會鎖定特定互斥鎖的全部線程的最高優先級。
pthread_mutexattr_getprioceiling 返回值
若是成功完成,pthread_mutexattr_getprioceiling()會返回 0。其餘任何返回值都表示出現了錯誤。
若是出現如下任一狀況,pthread_mutexattr_getprioceiling()將失敗並返回對應的值。
ENOSYS
描述:_POSIX_THREAD_PRIO_PROTECT 選項未定義而且該實現不支持此函數。
若是出現如下任一狀況,pthread_mutexattr_getprioceiling()可能會失敗並返回對應的值。
EINVAL
描述:attr 指定的值無效。
EPERM
描述:調用方無權執行該操做。
pthread_mutexattr_setprioceiling(3C)可用來設置互斥鎖的優先級上限。
pthread_mutex_setprioceiling 語法
#include <pthread.h>int pthread_mutex_setprioceiling(pthread_mutex_t *mutex, int prioceiling, int *old_ceiling);pthread_mutex_setprioceiling()可更改互斥鎖 mutex 的優先級上限 prioceiling。pthread_mutex_setprioceiling()可鎖定互斥鎖(若是未鎖定的話),或者一直處於阻塞狀態,直到pthread_mutex_setprioceiling()成功鎖定該互斥鎖,更改該互斥鎖的優先級上限並將該互斥鎖釋放爲止。鎖定互斥鎖的過程無需遵循優先級保護協議。
若是pthread_mutex_setprioceiling()成功,則將在 old_ceiling 中返回之前的優先級上限值。若是pthread_mutex_setprioceiling()失敗,則互斥鎖的優先級上限保持不變。
pthread_mutex_setprioceiling 返回值
若是成功完成,pthread_mutex_setprioceiling()會返回 0。其餘任何返回值都表示出現了錯誤。
若是出現如下狀況,pthread_mutexatt_setprioceiling()將失敗並返回對應的值。
ENOSYS
描述:選項_POSIX_THREAD_PRIO_PROTECT 未定義而且該實現不支持此函數。
若是出現如下任一狀況,pthread_mutex_setprioceiling()可能會失敗並返回對應的值。
EINVAL
描述:prioceiling 所請求的優先級超出了範圍。
EINVAL
描述:mutex 指定的值不會引用當前存在的互斥鎖。
ENOSYS
描述:該實現不支持互斥鎖的優先級上限協議。
EPERM
描述:調用方無權執行該操做。
pthread_mutexattr_getprioceiling(3C)可用來獲取互斥鎖的優先級上限。
pthread_mutex_getprioceiling 語法
#include <pthread.h>int pthread_mutex_getprioceiling(const pthread_mutex_t *mutex, int *prioceiling);pthread_mutex_getprioceiling()會返回 mutex 的優先級上限 prioceiling。
pthread_mutex_getprioceiling 返回值
若是成功完成,pthread_mutex_getprioceiling()會返回 0。其餘任何返回值都表示出現了錯誤。
若是出現如下任一狀況,pthread_mutexatt_getprioceiling()將失敗並返回對應的值。
ENOSYS
描述:_POSIX_THREAD_PRIO_PROTECT 選項未定義而且該實現不支持此函數。
若是出現如下任一狀況,pthread_mutex_getprioceiling()可能會失敗並返回對應的值。
EINVAL
描述:mutex 指定的值不會引用當前存在的互斥鎖。
ENOSYS
描述:該實現不支持互斥鎖的優先級上限協議。
EPERM
描述:調用方無權執行該操做。
pthread_mutexattr_setrobust_np(3C)可用來設置互斥鎖屬性對象的強健屬性。
pthread_mutexattr_setrobust_np 語法
#include <pthread.h>int pthread_mutexattr_setrobust_np(pthread_mutexattr_t *attr, int *robustness);注 –
僅當定義了符號 _POSIX_THREAD_PRIO_INHERIT 時,pthread_mutexattr_setrobust_np()才適用。
attr 指示之前經過調用pthread_mutexattr_init()建立的互斥鎖屬性對象。
robustness 定義在互斥鎖的屬主失敗時的行爲。pthread.h 中定義的 robustness 的值爲 PTHREAD_MUTEX_ROBUST_NP 或 PTHREAD_MUTEX_STALLED_NP。缺省值爲 PTHREAD_MUTEX_STALLED_NP。
PTHREAD_MUTEX_ROBUST_NP
若是互斥鎖的屬主失敗,則之後對pthread_mutex_lock()的全部調用將以不肯定的方式被阻塞。
PTHREAD_MUTEX_STALLED_NP
互斥鎖的屬主失敗時,將會解除鎖定該互斥鎖。互斥鎖的下一個屬主將獲取該互斥鎖,並返回錯誤 EOWNWERDEAD。
注 –應用程序必須檢查pthread_mutex_lock()的返回代碼,查找返回錯誤 EOWNWERDEAD 的互斥鎖。
互斥鎖的新屬主應使該互斥鎖所保護的狀態保持一致。若是上一個屬主失敗,則互斥鎖狀態可能會不一致。
若是新屬主可以使狀態保持一致,請針對該互斥鎖調用pthread_mutex_consistent_np(),並解除鎖定該互斥鎖。
若是新屬主沒法使狀態保持一致,請勿針對該互斥鎖調用pthread_mutex_consistent_np(),而是解除鎖定該互斥鎖。
全部等待的線程都將被喚醒,之後對pthread_mutex_lock()的全部調用都將沒法獲取該互斥鎖。返回代碼爲 ENOTRECOVERABLE。經過調用pthread_mutex_destroy()取消對互斥鎖的初始化,並調用pthread_mutex_int()從新初始化該互斥鎖,可以使該互斥鎖保持一致。
若是已獲取該鎖的線程失敗並返回 EOWNERDEAD,則下一個屬主獲取該鎖時將返回代碼 EOWNERDEAD。
pthread_mutexattr_setrobust_np 返回值
若是成功完成,pthread_mutexattr_setrobust_np()會返回 0。其餘任何返回值都表示出現了錯誤。
若是出現如下任一狀況,pthread_mutexattr_setrobust_np()將失敗並返回對應的值。
ENOSYS
描述:選項 _POSIX_THREAD_PRIO__INHERIT 未定義,或者該實現不支持pthread_mutexattr_setrobust_np()。
ENOTSUP
描述:robustness 指定的值不受支持。
pthread_mutexattr_setrobust_np()可能會在出現如下狀況時失敗:
EINVAL
描述:attr 或 robustness 指定的值無效。
互斥鎖實際的效率仍是可讓人接受的,加鎖的時間大概100ns左右,而實際上互斥鎖的一種可能的實現是先自旋一段時間,當自旋的時間超過閥值以後再將線程投入睡眠中,所以在併發運算中使用互斥鎖(每次佔用鎖的時間很短)的效果可能不亞於使用自旋鎖。