互斥鎖概念在編程中是來保證共享數(shù)據(jù)操作的完整性。
文本示例
下面舉例:
在Posix Thread中定義有一套專門用于線程同步的mutex函數(shù)。
1. 創(chuàng)建和銷毀
有兩種方法創(chuàng)建互斥鎖,靜態(tài)方式和動(dòng)態(tài)方式。POSIX定義了一個(gè)宏P(guān)THREAD_MUTEX_INITIALIZER來靜態(tài)初始化互斥鎖,方法如下: pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在LinuxThreads實(shí)現(xiàn)中,pthread_mutex_t是一個(gè)結(jié)構(gòu),而PTHREAD_MUTeX_INITIALIZER則是一個(gè)結(jié)構(gòu)常量。
動(dòng)態(tài)方式是采用pthread_mutex_init()函數(shù)來初始化互斥鎖,API定義如下: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) 其中mutexattr用于指定互斥鎖屬性(見下),如果為NULL則使用缺省屬性。
pthread_mutex_destroy ()用于注銷一個(gè)互斥鎖,API定義如下: int pthread_mutex_destroy(pthread_mutex_t *mutex) 銷毀一個(gè)互斥鎖即意味著釋放它所占用的資源,且要求鎖當(dāng)前處于開放狀態(tài)。由于在Linux中,互斥鎖并不占用任何資源,因此LinuxThreads中的 pthread_mutex_destroy()除了檢查鎖狀態(tài)以外(鎖定狀態(tài)則返回EBUSY)沒有其他動(dòng)作。
2. 互斥鎖屬性
互斥鎖的屬性在創(chuàng)建鎖的時(shí)候指定,在LinuxThreads實(shí)現(xiàn)中僅有一個(gè)鎖類型屬性,不同的鎖類型在試圖對(duì)一個(gè)已經(jīng)被鎖定的互斥鎖加鎖時(shí)表現(xiàn)不同。當(dāng)前(glibc2.2.3,Linuxthreads0.9)有四個(gè)值可供選擇:
* PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當(dāng)一個(gè)線程加鎖以后,其余請(qǐng)求鎖的線程將形成一個(gè)等待隊(duì)列,并在解鎖后按優(yōu)先級(jí)獲得鎖。這種鎖策略保證了資源分配的公平性。
* PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個(gè)線程對(duì)同一個(gè)鎖成功獲得多次,并通過多次unlock解鎖。如果是不同線程請(qǐng)求,則在加鎖線程解鎖時(shí)重新競(jìng)爭(zhēng)。
* PTHREAD_MUTEX_ERRORCHECK_NP,檢錯(cuò)鎖,如果同一個(gè)線程請(qǐng)求同一個(gè)鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動(dòng)作相同。這樣就保證當(dāng)不允許多次加鎖時(shí)不會(huì)出現(xiàn)最簡(jiǎn)單情況下的死鎖。
* PTHREAD_MUTEX_ADAPTIVE_NP,適應(yīng)鎖,動(dòng)作最簡(jiǎn)單的鎖類型,僅等待解鎖后重新競(jìng)爭(zhēng)。
3.鎖操作
鎖操作主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測(cè)試加鎖 pthread_mutex_trylock()三個(gè),不論哪種類型的鎖,都不可能被兩個(gè)不同的線程同時(shí)得到,而必須等待解鎖。對(duì)于普通鎖和適應(yīng)鎖類型,解鎖者可以是同進(jìn)程內(nèi)任何線程;而檢錯(cuò)鎖則必須由加鎖者解鎖才有效,否則返回EPERM;對(duì)于嵌套鎖,文檔和實(shí)現(xiàn)要求必須由加鎖者解鎖,但實(shí)驗(yàn)結(jié)果表明并沒有這種限制,這個(gè)不同還沒有得到解釋。在同一進(jìn)程中的線程,如果加鎖后沒有解鎖,則任何其他線程都無法再獲得鎖。
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()類似,不同的是在鎖已經(jīng)被占據(jù)時(shí)返回EBUSY而不是掛起等待。
4. 其他
POSIX 線程鎖機(jī)制的Linux實(shí)現(xiàn)都不是取消點(diǎn),因此,延遲取消類型的線程不會(huì)因收到取消信號(hào)而離開加鎖等待。值得注意的是,如果線程在加鎖后解鎖前被取消,鎖將永遠(yuǎn)保持鎖定狀態(tài),因此如果在關(guān)鍵區(qū)段內(nèi)有取消點(diǎn)存在,或者設(shè)置了異步取消類型,則必須在退出回調(diào)函數(shù)中解鎖。
這個(gè)鎖機(jī)制同時(shí)也不是異步信號(hào)安全的,也就是說,不應(yīng)該在信號(hào)處理過程中使用互斥鎖,否則容易造成死鎖。
互斥鎖屬性使用互斥鎖(互斥)可以使線程按順序執(zhí)行。通常,互斥鎖通過確保一次只有一個(gè)線程執(zhí)行代碼的臨界段來同步多個(gè)線程。互斥鎖還可以保護(hù)單線程代碼。
要更改缺省的互斥鎖屬性,可以對(duì)屬性對(duì)象進(jìn)行聲明和初始化。通常,互斥鎖屬性會(huì)設(shè)置在應(yīng)用程序開頭的某個(gè)位置,以便可以快速查找和輕松修改。表 4–1列出了用來處理互斥鎖屬性的函數(shù)。
表 4–1 互斥鎖屬性例程
表 4–2中顯示了在定義互斥范圍時(shí) Solaris 線程和 POSIX 線程之間的差異。
表 4–2 互斥鎖范圍比較
屬性對(duì)象
使用pthread_mutexattr_init(3C)可以將與互斥鎖對(duì)象相關(guān)聯(lián)的屬性初始化為其缺省值。在執(zhí)行過程中,線程系統(tǒng)會(huì)為每個(gè)屬性對(duì)象分配存儲(chǔ)空間。
pthread_mutexattr_init 語法
int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
#include
pthread_mutexattr_t mattr;
int ret;/* initialize an attribute to default value */
ret = pthread_mutexattr_init(&mattr);
調(diào)用此函數(shù)時(shí),pshared 屬性的缺省值為 PTHREAD_PROCESS_PRIVATE。該值表示可以在進(jìn)程內(nèi)使用經(jīng)過初始化的互斥鎖。
mattr 的類型為 opaque,其中包含一個(gè)由系統(tǒng)分配的屬性對(duì)象。mattr 范圍可能的值為 PTHREAD_PROCESS_PRIVATE 和 PTHREAD_PROCESS_SHARED。PTHREAD_PROCESS_PRIVATE 是缺省值。
對(duì)于互斥鎖屬性對(duì)象,必須首先通過調(diào)用 pthread_mutexattr_destroy(3C) 將其銷毀,才能重新初始化該對(duì)象。pthread_mutexattr_init()調(diào)用會(huì)導(dǎo)致分配類型為 opaque 的對(duì)象。如果未銷毀該對(duì)象,則會(huì)導(dǎo)致內(nèi)存泄漏。
ENOMEM
描述:內(nèi)存不足,無法初始化互斥鎖屬性對(duì)象。
銷毀對(duì)象
pthread_mutexattr_destroy(3C)可用來取消分配用于維護(hù)pthread_mutexattr_init()所創(chuàng)建的屬性對(duì)象的存儲(chǔ)空間。
pthread_mutexattr_destroy 語法
int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr)#include
pthread_mutexattr_destroy 返回值
pthread_mutexattr_destroy()成功完成之后會(huì)返回零。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。如果出現(xiàn)以下情況,該函數(shù)將失敗并返回對(duì)應(yīng)的值。
EINVAL
描述:由 mattr 指定的值無效。
設(shè)置范圍
pthread_mutexattr_setpshared(3C)可用來設(shè)置互斥鎖變量的作用域。
pthread_mutexattr_setpshared 語法
int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared);
#include
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);
互斥鎖變量可以是進(jìn)程專用的(進(jìn)程內(nèi))變量,也可以是系統(tǒng)范圍內(nèi)的(進(jìn)程間)變量。要在多個(gè)進(jìn)程中的線程之間共享互斥鎖,可以在共享內(nèi)存中創(chuàng)建互斥鎖,并將pshared屬性設(shè)置為 PTHREAD_PROCESS_SHARED。 此行為與最初的 Solaris 線程實(shí)現(xiàn)中mutex_init()中的 USYNC_PROCESS 標(biāo)志等效。
如果互斥鎖的pshared屬性設(shè)置為 PTHREAD_PROCESS_PRIVATE,則僅有那些由同一個(gè)進(jìn)程創(chuàng)建的線程才能夠處理該互斥鎖。
獲取范圍
pthread_mutexattr_getpshared(3C)可用來返回由pthread_mutexattr_setpshared()定義的互斥鎖變量的范圍。
pthread_mutexattr_getpshared 語法
int pthread_mutexattr_getpshared(pthread_mutexattr_t *mattr, int *pshared);#include
類型屬性
pthread_mutexattr_settype(3C)可用來設(shè)置互斥鎖的type屬性。
pthread_mutexattr_settype 語法
#include
type參數(shù)指定互斥鎖的類型。以下列出了有效的互斥鎖類型:
PTHREAD_MUTEX_NORMAL
描述:此類型的互斥鎖不會(huì)檢測(cè)死鎖。如果線程在不首先解除互斥鎖的情況下嘗試重新鎖定該互斥鎖,則會(huì)產(chǎn)生死鎖。嘗試解除由其他線程鎖定的互斥鎖會(huì)產(chǎn)生不確定的行為。如果嘗試解除鎖定的互斥鎖未鎖定,則會(huì)產(chǎn)生不確定的行為。
PTHREAD_MUTEX_ERRORCHECK
描述:此類型的互斥鎖可提供錯(cuò)誤檢查。如果線程在不首先解除鎖定互斥鎖的情況下嘗試重新鎖定該互斥鎖,則會(huì)返回錯(cuò)誤。如果線程嘗試解除鎖定的互斥鎖已經(jīng)由其他線程鎖定,則會(huì)返回錯(cuò)誤。如果線程嘗試解除鎖定的互斥鎖未鎖定,則會(huì)返回錯(cuò)誤。
PTHREAD_MUTEX_RECURSIVE
描述:如果線程在不首先解除鎖定互斥鎖的情況下嘗試重新鎖定該互斥鎖,則可成功鎖定該互斥鎖。 與 PTHREAD_MUTEX_NORMAL 類型的互斥鎖不同,對(duì)此類型互斥鎖進(jìn)行重新鎖定時(shí)不會(huì)產(chǎn)生死鎖情況。多次鎖定互斥鎖需要進(jìn)行相同次數(shù)的解除鎖定才可以釋放該鎖,然后其他線程才能獲取該互斥鎖。如果線程嘗試解除鎖定的互斥鎖已經(jīng)由其他線程鎖定,則會(huì)返回錯(cuò)誤。 如果線程嘗試解除鎖定的互斥鎖未鎖定,則會(huì)返回錯(cuò)誤。
PTHREAD_MUTEX_DEFAULT
描述:如果嘗試以遞歸方式鎖定此類型的互斥鎖,則會(huì)產(chǎn)生不確定的行為。對(duì)于不是由調(diào)用線程鎖定的此類型互斥鎖,如果嘗試對(duì)它解除鎖定,則會(huì)產(chǎn)生不確定的行為。對(duì)于尚未鎖定的此類型互斥鎖,如果嘗試對(duì)它解除鎖定,也會(huì)產(chǎn)生不確定的行為。允許在實(shí)現(xiàn)中將該互斥鎖映射到其他互斥鎖類型之一。對(duì)于 Solaris 線程,PTHREAD_PROCESS_DEFAULT 會(huì)映射到 PTHREAD_PROCESS_NORMAL。
pthread_mutexattr_settype 返回值
如果運(yùn)行成功,pthread_mutexattr_settype 函數(shù)會(huì)返回零。否則,將返回用于指明錯(cuò)誤的錯(cuò)誤號(hào)。
EINVAL
描述:值為type無效。
EINVAL
描述:attr指定的值無效。
獲取屬性
pthread_mutexattr_gettype(3C)可用來獲取由pthread_mutexattr_settype()設(shè)置的互斥鎖的type屬性。
pthread_mutexattr_gettype 語法
#include
type參數(shù)指定互斥鎖的類型。有效的互斥鎖類型包括:
PTHREAD_MUTEX_NORMAL
PTHREAD_MUTEX_ERRORCHECK
PTHREAD_MUTEX_RECURSIVE
PTHREAD_MUTEX_DEFAULT
有關(guān)每種類型的說明,請(qǐng)參見pthread_mutexattr_settype 語法。
pthread_mutexattr_gettype 返回值
如果成功完成,pthread_mutexattr_gettype()會(huì)返回 0。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。
設(shè)置協(xié)議
pthread_mutexattr_setprotocol(3C)可用來設(shè)置互斥鎖屬性對(duì)象的協(xié)議屬性。
pthread_mutexattr_setprotocol 語法
#include
protocol 可定義應(yīng)用于互斥鎖屬性對(duì)象的協(xié)議。
pthread.h 中定義的 protocol 可以是以下值之一:PTHREAD_PRIO_NONE、PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT。
PTHREAD_PRIO_NONE
線程的優(yōu)先級(jí)和調(diào)度不會(huì)受到互斥鎖擁有權(quán)的影響。
PTHREAD_PRIO_INHERIT
此協(xié)議值(如 thrd1)會(huì)影響線程的優(yōu)先級(jí)和調(diào)度。如果更高優(yōu)先級(jí)的線程因 thrd1 所擁有的一個(gè)或多個(gè)互斥鎖而被阻塞,而這些互斥鎖是用 PTHREAD_PRIO_INHERIT 初始化的,則 thrd1 將以高于它的優(yōu)先級(jí)或者所有正在等待這些互斥鎖(這些互斥鎖是 thrd1 指所擁有的互斥鎖)的線程的最高優(yōu)先級(jí)運(yùn)行。
如果 thrd1 因另一個(gè)線程 (thrd3) 擁有的互斥鎖而被阻塞,則相同的優(yōu)先級(jí)繼承效應(yīng)會(huì)以遞歸方式傳播給 thrd3。
使用 PTHREAD_PRIO_INHERIT 可以避免優(yōu)先級(jí)倒置。低優(yōu)先級(jí)的線程持有較高優(yōu)先級(jí)線程所需的鎖時(shí),便會(huì)發(fā)生優(yōu)先級(jí)倒置。只有在較低優(yōu)先級(jí)的線程釋放該鎖之后,較高優(yōu)先級(jí)的線程才能繼續(xù)使用該鎖。設(shè)置 PTHREAD_PRIO_INHERIT,以便按與預(yù)期的優(yōu)先級(jí)相反的優(yōu)先級(jí)處理每個(gè)線程。
如果為使用協(xié)議屬性值 PTHREAD_PRIO_INHERIT 初始化的互斥鎖定義了 _POSIX_THREAD_PRIO_INHERIT,則互斥鎖的屬主失敗時(shí)會(huì)執(zhí)行以下操作。屬主失敗時(shí)的行為取決于pthread_mutexattr_setrobust_np()的 robustness 參數(shù)的值。
解除鎖定互斥鎖。
互斥鎖的下一個(gè)屬主將獲取該互斥鎖,并返回錯(cuò)誤 EOWNERDEAD。
互斥鎖的下一個(gè)屬主會(huì)嘗試使該互斥鎖所保護(hù)的狀態(tài)一致。如果上一個(gè)屬主失敗,則狀態(tài)可能會(huì)不一致。如果屬主成功使?fàn)顟B(tài)保持一致,則可針對(duì)該互斥鎖調(diào)用pthread_mutex_init()并解除鎖定該互斥鎖。
注 –如果針對(duì)以前初始化的但尚未銷毀的互斥鎖調(diào)用pthread_mutex_init(),則該互斥鎖不會(huì)重新初始化。
如果屬主無法使?fàn)顟B(tài)保持一致,請(qǐng)勿調(diào)用pthread_mutex_init(),而是解除鎖定該互斥鎖。在這種情況下,所有等待的線程都將被喚醒。以后對(duì)pthread_mutex_lock()的所有調(diào)用將無法獲取互斥鎖,并將返回錯(cuò)誤代碼 ENOTRECOVERABLE。現(xiàn)在,通過調(diào)用pthread_mutex_destroy()來取消初始化該互斥鎖,即可使其狀態(tài)保持一致。調(diào)用pthread_mutex_init()可重新初始化互斥鎖。
如果已獲取該鎖的線程失敗并返回 EOWNERDEAD,則下一個(gè)屬主將獲取該鎖及錯(cuò)誤代碼 EOWNERDEAD。
PTHREAD_PRIO_PROTECT
當(dāng)線程擁有一個(gè)或多個(gè)使用 PTHREAD_PRIO_PROTECT 初始化的互斥鎖時(shí),此協(xié)議值會(huì)影響其他線程(如 thrd2)的優(yōu)先級(jí)和調(diào)度。thrd2 以其較高的優(yōu)先級(jí)或者以 thrd2 擁有的所有互斥鎖的最高優(yōu)先級(jí)上限運(yùn)行。基于被 thrd2 擁有的任一互斥鎖阻塞的較高優(yōu)先級(jí)線程對(duì)于 thrd2 的調(diào)度沒有任何影響。
如果某個(gè)線程調(diào)用sched_setparam()來更改初始優(yōu)先級(jí),則調(diào)度程序不會(huì)采用新優(yōu)先級(jí)將該線程移到調(diào)度隊(duì)列末尾。
線程擁有使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 初始化的互斥鎖
線程解除鎖定使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 初始化的互斥鎖
一個(gè)線程可以同時(shí)擁有多個(gè)混合使用 PTHREAD_PRIO_INHERIT 和 PTHREAD_PRIO_PROTECT 初始化的互斥鎖。在這種情況下,該線程將以通過其中任一協(xié)議獲取的最高優(yōu)先級(jí)執(zhí)行。
pthread_mutexattr_setprotocol 返回值
如果成功完成,pthread_mutexattr_setprotocol()會(huì)返回 0。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。
如果出現(xiàn)以下任一情況,pthread_mutexattr_setprotocol()將失敗并返回對(duì)應(yīng)的值。
ENOSYS
描述:選項(xiàng) _POSIX_THREAD_PRIO_INHERIT 和 _POSIX_THREAD_PRIO_PROTECT 均未定義并且該實(shí)現(xiàn)不支持此函數(shù)。
ENOTSUP
描述:protocol 指定的值不受支持。
如果出現(xiàn)以下任一情況,pthread_mutexattr_setprotocol()可能會(huì)失敗并返回對(duì)應(yīng)的值。
EINVAL
描述:attr 或 protocol 指定的值無效。
EPERM
描述:調(diào)用方無權(quán)執(zhí)行該操作。
獲取協(xié)議
pthread_mutexattr_getprotocol(3C)可用來獲取互斥鎖屬性對(duì)象的協(xié)議屬性。
pthread_mutexattr_getprotocol 語法
#include
protocol 包含以下協(xié)議屬性之一:PTHREAD_PRIO_NONE、PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT。
pthread_mutexattr_getprotocol 返回值
如果成功完成,pthread_mutexattr_getprotocol()會(huì)返回 0。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。
如果出現(xiàn)以下情況,pthread_mutexattr_getprotocol()將失敗并返回對(duì)應(yīng)的值。
ENOSYS
描述:_POSIX_THREAD_PRIO_INHERIT 選項(xiàng)和 _POSIX_THREAD_PRIO_PROTECT 選項(xiàng)均未定義并且該實(shí)現(xiàn)不支持此函數(shù)。
如果出現(xiàn)以下任一情況,pthread_mutexattr_getprotocol()可能會(huì)失敗并返回對(duì)應(yīng)的值。
EINVAL
描述:attr 指定的值無效。
EPERM
描述:調(diào)用方無權(quán)執(zhí)行該操作。
設(shè)置上限
pthread_mutexattr_setprioceiling(3C)可用來設(shè)置互斥鎖屬性對(duì)象的優(yōu)先級(jí)上限屬性。
pthread_mutexattr_setprioceiling 語法
#include
prioceiling 指定已初始化互斥鎖的優(yōu)先級(jí)上限。優(yōu)先級(jí)上限定義執(zhí)行互斥鎖保護(hù)的臨界段時(shí)的最低優(yōu)先級(jí)。prioceiling 位于 SCHED_FIFO 所定義的優(yōu)先級(jí)的最大范圍內(nèi)。要避免優(yōu)先級(jí)倒置,請(qǐng)將 prioceiling 設(shè)置為高于或等于可能會(huì)鎖定特定互斥鎖的所有線程的最高優(yōu)先級(jí)。
oldceiling 包含以前的優(yōu)先級(jí)上限值。
pthread_mutexattr_setprioceiling 返回值
如果成功完成,pthread_mutexattr_setprioceiling()會(huì)返回 0。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。
如果出現(xiàn)以下任一情況,pthread_mutexattr_setprioceiling()將失敗并返回對(duì)應(yīng)的值。
ENOSYS
描述:選項(xiàng) _POSIX_THREAD_PRIO_PROTECT 未定義并且該實(shí)現(xiàn)不支持此函數(shù)。
如果出現(xiàn)以下任一情況,pthread_mutexattr_setprioceiling()可能會(huì)失敗并返回對(duì)應(yīng)的值。
EINVAL
描述:attr 或 prioceiling 指定的值無效。
EPERM
描述:調(diào)用方無權(quán)執(zhí)行該操作。
互斥上限
pthread_mutexattr_getprioceiling(3C)可用來獲取互斥鎖屬性對(duì)象的優(yōu)先級(jí)上限屬性。
pthread_mutexattr_getprioceiling 語法
#include
注 –
僅當(dāng)定義了 _POSIX_THREAD_PRIO_PROTECT 符號(hào)時(shí),attr 互斥鎖屬性對(duì)象才會(huì)包括優(yōu)先級(jí)上限屬性。
pthread_mutexattr_getprioceiling()返回 prioceiling 中已初始化互斥鎖的優(yōu)先級(jí)上限。優(yōu)先級(jí)上限定義執(zhí)行互斥鎖保護(hù)的臨界段時(shí)的最低優(yōu)先級(jí)。prioceiling 位于 SCHED_FIFO 所定義的優(yōu)先級(jí)的最大范圍內(nèi)。要避免優(yōu)先級(jí)倒置,請(qǐng)將 prioceiling 設(shè)置為高于或等于可能會(huì)鎖定特定互斥鎖的所有線程的最高優(yōu)先級(jí)。
pthread_mutexattr_getprioceiling 返回值
如果成功完成,pthread_mutexattr_getprioceiling()會(huì)返回 0。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。
如果出現(xiàn)以下任一情況,pthread_mutexattr_getprioceiling()將失敗并返回對(duì)應(yīng)的值。
ENOSYS
描述:_POSIX_THREAD_PRIO_PROTECT 選項(xiàng)未定義并且該實(shí)現(xiàn)不支持此函數(shù)。
如果出現(xiàn)以下任一情況,pthread_mutexattr_getprioceiling()可能會(huì)失敗并返回對(duì)應(yīng)的值。
EINVAL
描述:attr 指定的值無效。
EPERM
描述:調(diào)用方無權(quán)執(zhí)行該操作。
優(yōu)先級(jí)設(shè)置
pthread_mutexattr_setprioceiling(3C)可用來設(shè)置互斥鎖的優(yōu)先級(jí)上限。
pthread_mutex_setprioceiling 語法
#include
如果pthread_mutex_setprioceiling()成功,則將在 old_ceiling 中返回以前的優(yōu)先級(jí)上限值。如果pthread_mutex_setprioceiling()失敗,則互斥鎖的優(yōu)先級(jí)上限保持不變。
pthread_mutex_setprioceiling 返回值
如果成功完成,pthread_mutex_setprioceiling()會(huì)返回 0。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。
如果出現(xiàn)以下情況,pthread_mutexatt_setprioceiling()將失敗并返回對(duì)應(yīng)的值。
ENOSYS
描述:選項(xiàng)_POSIX_THREAD_PRIO_PROTECT 未定義并且該實(shí)現(xiàn)不支持此函數(shù)。
如果出現(xiàn)以下任一情況,pthread_mutex_setprioceiling()可能會(huì)失敗并返回對(duì)應(yīng)的值。
EINVAL
描述:prioceiling 所請(qǐng)求的優(yōu)先級(jí)超出了范圍。
EINVAL
描述:mutex 指定的值不會(huì)引用當(dāng)前存在的互斥鎖。
ENOSYS
描述:該實(shí)現(xiàn)不支持互斥鎖的優(yōu)先級(jí)上限協(xié)議。
EPERM
描述:調(diào)用方無權(quán)執(zhí)行該操作。
獲取設(shè)置
pthread_mutexattr_getprioceiling(3C)可用來獲取互斥鎖的優(yōu)先級(jí)上限。
pthread_mutex_getprioceiling 語法
#include
pthread_mutex_getprioceiling 返回值
如果成功完成,pthread_mutex_getprioceiling()會(huì)返回 0。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。
如果出現(xiàn)以下任一情況,pthread_mutexatt_getprioceiling()將失敗并返回對(duì)應(yīng)的值。
ENOSYS
描述:_POSIX_THREAD_PRIO_PROTECT 選項(xiàng)未定義并且該實(shí)現(xiàn)不支持此函數(shù)。
如果出現(xiàn)以下任一情況,pthread_mutex_getprioceiling()可能會(huì)失敗并返回對(duì)應(yīng)的值。
EINVAL
描述:mutex 指定的值不會(huì)引用當(dāng)前存在的互斥鎖。
ENOSYS
描述:該實(shí)現(xiàn)不支持互斥鎖的優(yōu)先級(jí)上限協(xié)議。
EPERM
描述:調(diào)用方無權(quán)執(zhí)行該操作。
強(qiáng)健屬性
pthread_mutexattr_setrobust_np(3C)可用來設(shè)置互斥鎖屬性對(duì)象的強(qiáng)健屬性。
pthread_mutexattr_setrobust_np 語法
#include
僅當(dāng)定義了符號(hào) _POSIX_THREAD_PRIO_INHERIT 時(shí),pthread_mutexattr_setrobust_np()才適用。
attr 指示以前通過調(diào)用pthread_mutexattr_init()創(chuàng)建的互斥鎖屬性對(duì)象。
robustness 定義在互斥鎖的屬主失敗時(shí)的行為。pthread.h 中定義的 robustness 的值為 PTHREAD_MUTEX_ROBUST_NP 或 PTHREAD_MUTEX_STALLED_NP。缺省值為 PTHREAD_MUTEX_STALLED_NP。
PTHREAD_MUTEX_ROBUST_NP
如果互斥鎖的屬主失敗,則以后對(duì)pthread_mutex_lock()的所有調(diào)用將以不確定的方式被阻塞。
PTHREAD_MUTEX_STALLED_NP
互斥鎖的屬主失敗時(shí),將會(huì)解除鎖定該互斥鎖。互斥鎖的下一個(gè)屬主將獲取該互斥鎖,并返回錯(cuò)誤 EOWNWERDEAD。
注 –應(yīng)用程序必須檢查pthread_mutex_lock()的返回代碼,查找返回錯(cuò)誤 EOWNWERDEAD 的互斥鎖。
互斥鎖的新屬主應(yīng)使該互斥鎖所保護(hù)的狀態(tài)保持一致。如果上一個(gè)屬主失敗,則互斥鎖狀態(tài)可能會(huì)不一致。
如果新屬主能夠使?fàn)顟B(tài)保持一致,請(qǐng)針對(duì)該互斥鎖調(diào)用pthread_mutex_consistent_np(),并解除鎖定該互斥鎖。
如果新屬主無法使?fàn)顟B(tài)保持一致,請(qǐng)勿針對(duì)該互斥鎖調(diào)用pthread_mutex_consistent_np(),而是解除鎖定該互斥鎖。
所有等待的線程都將被喚醒,以后對(duì)pthread_mutex_lock()的所有調(diào)用都將無法獲取該互斥鎖。返回代碼為 ENOTRECOVERABLE。通過調(diào)用pthread_mutex_destroy()取消對(duì)互斥鎖的初始化,并調(diào)用pthread_mutex_int()重新初始化該互斥鎖,可使該互斥鎖保持一致。
如果已獲取該鎖的線程失敗并返回 EOWNERDEAD,則下一個(gè)屬主獲取該鎖時(shí)將返回代碼 EOWNERDEAD。
pthread_mutexattr_setrobust_np 返回值
如果成功完成,pthread_mutexattr_setrobust_np()會(huì)返回 0。其他任何返回值都表示出現(xiàn)了錯(cuò)誤。
如果出現(xiàn)以下任一情況,pthread_mutexattr_setrobust_np()將失敗并返回對(duì)應(yīng)的值。
ENOSYS
描述:選項(xiàng) _POSIX_THREAD_PRIO__INHERIT 未定義,或者該實(shí)現(xiàn)不支持pthread_mutexattr_setrobust_np()。
ENOTSUP
描述:robustness 指定的值不受支持。
pthread_mutexattr_setrobust_np()可能會(huì)在出現(xiàn)以下情況時(shí)失敗:
EINVAL
描述:attr 或 robustness 指定的值無效。
實(shí)現(xiàn)與效率
互斥鎖實(shí)際的效率還是可以讓人接受的,加鎖的時(shí)間大概100ns左右,而實(shí)際上互斥鎖的一種可能的實(shí)現(xiàn)是先自旋一段時(shí)間,當(dāng)自旋的時(shí)間超過閥值之后再將線程投入睡眠中,因此在并發(fā)運(yùn)算中使用互斥鎖(每次占用鎖的時(shí)間很短)的效果可能不亞于使用自旋鎖。
參考資料 >