歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux線程鎖詳解pthread_mutexattr_t

Linux線程鎖詳解pthread_mutexattr_t

日期:2017/3/3 13:00:42   编辑:Linux技術

在Posix Thread中定義有一套專門用於線程同步的mutex函數。

小A用pthread_mutex_lock() 鎖住勺子,直到用pthread_mutex_unlock()打開鎖之前,小B和小C都不能試圖為勺子加鎖。如果小B非要去鎖勺子,只能耐心waiting也就是傳說中的阻塞。

Mutex 數據結構:

typedef union

{

struct

{

int __lock;//lock操作的變量

unsigned int __count;//lock次數

int __owner;//thread ID

int __kind;

unsigned int __nusers;

int __spins;

} __data;

char __size[__SIZEOF_PTHREAD_MUTEX_T];

long int __align;

} pthread_mutex_t;

Mutex接口函數:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

pthread_mutex_init(&fastmutex, NULL); = pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;//POSIX標准類型:PTHREAD_MUTEX_FAST_NP

int pthread_mutex_lock(pthread_mutex_t *mutex);//lock,被其他線程鎖定時,阻塞直到unlock

int pthread_mutex_trylock(pthread_mutex_t *mutex);//嘗試lock,被鎖定時,返回EBUSY錯誤

int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict abs_timeout);//嘗試lock,abs_timeout時間內仍被鎖定,返回ETIMEOUT錯誤

int pthread_mutex_unlock(pthread_mutex_t *mutex);//unlock

int pthread_mutexattr_init(pthread_mutexattr_t *attr);//初始化Mutex屬性

int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind);

int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind);//type相關

1. 創建和銷毀

有兩種方法創建互斥鎖,靜態方式和動態方式。POSIX定義了一個宏PTHREAD_MUTEX_INITIALIZER來靜態初始化互斥鎖,方法如下:

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在LinuxThreads實現中,pthread_mutex_t是一個結構,而PTHREAD_MUTEX_INITIALIZER則是一個結構常量。

動態方式是采用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 互斥鎖范圍比較

SolarisPOSIX定義USYNC_PROCESSPTHREAD_PROCESS_SHARED用於同步該進程和其他進程中的線程USYNC_PROCESS_ROBUST無 POSIX 等效項用於在進程間可靠地同步線程USYNC_THREADPTHREAD_PROCESS_PRIVATE用於僅同步該進程中的線程初始化互斥鎖屬性對象  使用pthread_mutexattr_init(3C)可以將與互斥鎖對象相關聯的屬性初始化為其缺省值。在執行過程中,線程系統會為每個屬性對象分配存儲空間。 pthread_mutexattr_init

語法  int pthread_mutexattr_init(pthread_mutexattr_t *mattr);

#include

pthread_mutexattr_t mattr;

int ret;

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 的對象。如果未銷毀該對象,則會導致內存洩漏。 pthread_mutexattr_init

返回值  pthread_mutexattr_init()成功完成之後會返回零。其他任何返回值都表示出現了錯誤。如果出現以下情況,該函數將失敗並返回對應的值。

ENOMEM

描述: 內存不足,無法初始化互斥鎖屬性對象。

銷毀互斥鎖屬性對象  pthread_mutexattr_destroy(3C)

可用來取消分配用於維護pthread_mutexattr_init() 所創建的屬性對象的存儲空間。 pthread_mutexattr_destroy

語法  int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr)#include pthread_mutexattr_t mattr;int ret;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_mutexattr_t mattr;int ret;ret = pthread_mutexattr_init(&mattr);ret

= pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE);互斥鎖變量可以是進程專用的(進程內)變量,也可以是系統范圍內的(進程間)變量。要在多個進程中的線程之間共享互斥鎖,可以在共享內存中創建互斥鎖,並將 pshared 屬性設置為

PTHREAD_PROCESS_SHARED。 此行為與最初的 Solaris 線程實現中 mutex_init() 中的 USYNC_PROCESS

標志等效。

如果互斥鎖的 pshared 屬性設置為

PTHREAD_PROCESS_PRIVATE,則僅有那些由同一個進程創建的線程才能夠處理該互斥鎖。 pthread_mutexattr_setpshared

返回值  pthread_mutexattr_setpshared()成功完成之後會返回零。其他任何返回值都表示出現了錯誤。如果出現以下情況,該函數將失敗並返回對應的值。

EINVAL

描述: 由

mattr 指定的值無效。

獲取互斥鎖的范圍  pthread_mutexattr_getpshared(3C)

可用來返回由pthread_mutexattr_setpshared() 定義的互斥鎖變量的范圍。 pthread_mutexattr_getpshared

語法  int pthread_mutexattr_getpshared(pthread_mutexattr_t *mattr, int

*pshared);#include pthread_mutexattr_t mattr;int pshared, ret;ret = pthread_mutexattr_getpshared(&mattr, &pshared); 此函數可為屬性對象 mattr 獲取 pshared 的當前值。該值為 PTHREAD_PROCESS_SHARED 或 PTHREAD_PROCESS_PRIVATE。 pthread_mutexattr_getpshared

返回值  pthread_mutexattr_getpshared() 成功完成之後會返回零。其他任何返回值都表示出現了錯誤。如果出現以下情況,該函數將失敗並返回對應的值。

EINVAL

描述: 由

mattr 指定的值無效。

設置互斥鎖類型的屬性  pthread_mutexattr_settype(3C)

可用來設置互斥鎖的 type 屬性。pthread_mutexattr_settype

語法  #include 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 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 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 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 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 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 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 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 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 指定的值無效。

Copyright © Linux教程網 All Rights Reserved