列出了用來(lái)處理互斥鎖的函數(shù),。表 4–3 互斥鎖的例程
缺省調(diào)度策略 SCHED_OTHER 不指定線程可以獲取鎖的順序,。如果多個(gè)線程正在等待一個(gè)互斥鎖,,則獲取順序是不確定的,。出現(xiàn)爭(zhēng)用時(shí),,缺省行為是按優(yōu)先級(jí)順序解除線程的阻塞,。 初始化互斥鎖使用 pthread_mutex_init(3C) 可以使用缺省值初始化由 mp 所指向的互斥鎖,,還可以指定已經(jīng)使用 pthread_mutexattr_init() 設(shè)置的互斥鎖屬性,。mattr 的缺省值為 NULL。對(duì)于 Solaris 線程,,請(qǐng)參見(jiàn)mutex_init(3C) 語(yǔ)法,。 pthread_mutex_init 語(yǔ)法int pthread_mutex_init(pthread_mutex_t *mp, const pthread_mutexattr_t *mattr); #include <pthread.h> pthread_mutex_t mp = PTHREAD_MUTEX_INITIALIZER; pthread_mutexattr_t mattr; int ret; ret = pthread_mutex_init(&mp, NULL); ret = pthread_mutex_init(&mp, &mattr); 如果互斥鎖已初始化,則它會(huì)處于未鎖定狀態(tài),?;コ怄i可以位于進(jìn)程之間共享的內(nèi)存中或者某個(gè)進(jìn)程的專用內(nèi)存中。 注 – 初始化互斥鎖之前,,必須將其所在的內(nèi)存清零,。 將 mattr 設(shè)置為 NULL 的效果與傳遞缺省互斥鎖屬性對(duì)象的地址相同,但是沒(méi)有內(nèi)存開(kāi)銷,。 使用 PTHREAD_MUTEX_INITIALIZER 宏可以將以靜態(tài)方式定義的互斥鎖初始化為其缺省屬性,。 當(dāng)其他線程正在使用某個(gè)互斥鎖時(shí),請(qǐng)勿重新初始化或銷毀該互斥鎖,。如果任一操作沒(méi)有正確完成,,將會(huì)導(dǎo)致程序失敗。如果要重新初始化或銷毀某個(gè)互斥鎖,,則應(yīng)用程序必須確保當(dāng)前未使用該互斥鎖,。 pthread_mutex_init 返回值pthread_mutex_init() 在成功完成之后會(huì)返回零。其他任何返回值都表示出現(xiàn)了錯(cuò)誤,。如果出現(xiàn)以下任一情況,,該函數(shù)將失敗并返回對(duì)應(yīng)的值。
使互斥保持一致如果某個(gè)互斥鎖的屬主失敗,,該互斥鎖可能會(huì)變?yōu)椴灰恢隆?/p> 使用 pthread_mutex_consistent_np 可使互斥對(duì)象 mutex 在其屬主停止之后保持一致,。 pthread_mutex_consistent_np 語(yǔ)法#include <pthread.h> int pthread_mutex_consistent_np(pthread_mutex_t *mutex); 注 – 僅當(dāng)定義了 _POSIX_THREAD_PRIO_INHERIT 符號(hào)時(shí),pthread_mutex_consistent_np() 才適用,,并且僅適用于使用協(xié)議屬性值 PTHREAD_PRIO_INHERIT 初始化的互斥鎖,。 調(diào)用 pthread_mutex_lock() 會(huì)獲取不一致的互斥鎖。EOWNWERDEAD 返回值表示出現(xiàn)不一致的互斥鎖,。 持有以前通過(guò)調(diào)用 pthread_mutex_lock() 獲取的互斥鎖時(shí)可調(diào)用 pthread_mutex_consistent_np(),。 如果互斥鎖的屬主失敗,則該互斥鎖保護(hù)的臨界段可能會(huì)處于不一致?tīng)顟B(tài),。在這種情況下,,僅當(dāng)互斥鎖保護(hù)的臨界段可保持一致時(shí),,才能使該互斥鎖保持一致。 針對(duì)互斥鎖調(diào)用 pthread_mutex_lock(),、pthread_mutex_unlock() 和 pthread_mutex_trylock() 會(huì)以正常方式進(jìn)行,。 對(duì)于不一致或者未持有的互斥鎖,pthread_mutex_consistent_np() 的行為是不確定的,。 pthread_mutex_consistent_np 返回值pthread_mutex_consistent_np() 在成功完成之后會(huì)返回零。其他任何返回值都表示出現(xiàn)了錯(cuò)誤,。 pthread_mutex_consistent_np() 會(huì)在出現(xiàn)以下情況時(shí)失?。?/p>
pthread_mutex_consistent_np() 可能會(huì)在出現(xiàn)以下情況時(shí)失?。?/p>
鎖定互斥鎖使用 pthread_mutex_lock(3C) 可以鎖定 mutex 所指向的互斥鎖,。 pthread_mutex_lock 語(yǔ)法int pthread_mutex_lock(pthread_mutex_t *mutex); #include <pthread.h> pthread_mutex_t mutex; int ret; ret = pthread_ mutex_lock(&mp); 當(dāng) pthread_mutex_lock() 返回時(shí),,該互斥鎖已被鎖定。調(diào)用線程是該互斥鎖的屬主,。如果該互斥鎖已被另一個(gè)線程鎖定和擁有,,則調(diào)用線程將阻塞,直到該互斥鎖變?yōu)榭捎脼橹?。?duì)于 Solaris 線程,,請(qǐng)參見(jiàn)mutex_lock 語(yǔ)法。 如果互斥鎖類型為 PTHREAD_MUTEX_NORMAL,,則不提供死鎖檢測(cè),。嘗試重新鎖定互斥鎖會(huì)導(dǎo)致死鎖。如果某個(gè)線程嘗試解除鎖定的互斥鎖不是由該線程鎖定或未鎖定,,則將產(chǎn)生不確定的行為,。 如果互斥鎖類型為 PTHREAD_MUTEX_ERRORCHECK,則會(huì)提供錯(cuò)誤檢查,。如果某個(gè)線程嘗試重新鎖定的互斥鎖已經(jīng)由該線程鎖定,,則將返回錯(cuò)誤。如果某個(gè)線程嘗試解除鎖定的互斥鎖不是由該線程鎖定或者未鎖定,,則將返回錯(cuò)誤,。 如果互斥鎖類型為 PTHREAD_MUTEX_RECURSIVE,則該互斥鎖會(huì)保留鎖定計(jì)數(shù)這一概念,。線程首次成功獲取互斥鎖時(shí),,鎖定計(jì)數(shù)會(huì)設(shè)置為 1。線程每重新鎖定該互斥鎖一次,,鎖定計(jì)數(shù)就增加 1,。線程每解除鎖定該互斥鎖一次,,鎖定計(jì)數(shù)就減小 1。 鎖定計(jì)數(shù)達(dá)到 0 時(shí),,該互斥鎖即可供其他線程獲取,。如果某個(gè)線程嘗試解除鎖定的互斥鎖不是由該線程鎖定或者未鎖定,則將返回錯(cuò)誤,。 如果互斥鎖類型是 PTHREAD_MUTEX_DEFAULT,,則嘗試以遞歸方式鎖定該互斥鎖將產(chǎn)生不確定的行為。對(duì)于不是由調(diào)用線程鎖定的互斥鎖,,如果嘗試解除對(duì)它的鎖定,,則會(huì)產(chǎn)生不確定的行為。如果嘗試解除鎖定尚未鎖定的互斥鎖,,則會(huì)產(chǎn)生不確定的行為,。 pthread_mutex_lock 返回值pthread_mutex_lock() 在成功完成之后會(huì)返回零。其他任何返回值都表示出現(xiàn)了錯(cuò)誤,。如果出現(xiàn)以下任一情況,,該函數(shù)將失敗并返回對(duì)應(yīng)的值。
如果定義了 _POSIX_THREAD_PRIO_INHERIT 符號(hào),,則會(huì)使用協(xié)議屬性值 PTHREAD_PRIO_INHERIT 對(duì)互斥鎖進(jìn)行初始化,。此外,如果 pthread_mutexattr_setrobust_np() 的 robustness 參數(shù)是 PTHREAD_MUTEX_ROBUST_NP,,則該函數(shù)將失敗并返回以下值之一:
解除鎖定互斥鎖使用 pthread_mutex_unlock(3C) 可以解除鎖定 mutex 所指向的互斥鎖,。 對(duì)于 Solaris 線程,請(qǐng)參見(jiàn)mutex_unlock 語(yǔ)法,。 pthread_mutex_unlock 語(yǔ)法int pthread_mutex_unlock(pthread_mutex_t *mutex); #include <pthread.h> pthread_mutex_t mutex; int ret; ret = pthread_mutex_unlock(&mutex); pthread_mutex_unlock() 可釋放 mutex 引用的互斥鎖對(duì)象,。互斥鎖的釋放方式取決于互斥鎖的類型屬性,。 如果調(diào)用 pthread_mutex_unlock() 時(shí)有多個(gè)線程被 mutex 對(duì)象阻塞,,則互斥鎖變?yōu)榭捎脮r(shí)調(diào)度策略可確定獲取該互斥鎖的線程。 對(duì)于 PTHREAD_MUTEX_RECURSIVE 類型的互斥鎖,,當(dāng)計(jì)數(shù)達(dá)到零并且調(diào)用線程不再對(duì)該互斥鎖進(jìn)行任何鎖定時(shí),該互斥鎖將變?yōu)榭捎谩?/p> pthread_mutex_unlock 返回值pthread_mutex_unlock() 在成功完成之后會(huì)返回零,。其他任何返回值都表示出現(xiàn)了錯(cuò)誤,。如果出現(xiàn)以下情況,該函數(shù)將失敗并返回對(duì)應(yīng)的值,。
使用非阻塞互斥鎖鎖定使用 pthread_mutex_trylock(3C) 可以嘗試鎖定 mutex 所指向的互斥鎖。對(duì)于 Solaris 線程,,請(qǐng)參見(jiàn)mutex_trylock 語(yǔ)法,。 pthread_mutex_trylock 語(yǔ)法int pthread_mutex_trylock(pthread_mutex_t *mutex); #include <pthread.h> pthread_mutex_t mutex; int ret; ret = pthread_mutex_trylock(&mutex); pthread_mutex_trylock() 是 pthread_mutex_lock() 的非阻塞版本。如果 mutex 所引用的互斥對(duì)象當(dāng)前被任何線程(包括當(dāng)前線程)鎖定,,則將立即返回該調(diào)用,。否則,該互斥鎖將處于鎖定狀態(tài),,調(diào)用線程是其屬主,。 pthread_mutex_trylock 返回值pthread_mutex_trylock() 在成功完成之后會(huì)返回零。其他任何返回值都表示出現(xiàn)了錯(cuò)誤,。如果出現(xiàn)以下任一情況,,該函數(shù)將失敗并返回對(duì)應(yīng)的值。
如果定義了 _POSIX_THREAD_PRIO_INHERIT 符號(hào),,則會(huì)使用協(xié)議屬性值 PTHREAD_PRIO_INHERIT 對(duì)互斥鎖進(jìn)行初始化。此外,如果 pthread_mutexattr_setrobust_np() 的 robustness 參數(shù)是 PTHREAD_MUTEX_ROBUST_NP,,則該函數(shù)將失敗并返回以下值之一:
銷毀互斥鎖使用 pthread_mutex_destroy(3C) 可以銷毀與 mp 所指向的互斥鎖相關(guān)聯(lián)的任何狀態(tài),。對(duì)于 Solaris 線程,請(qǐng)參見(jiàn)mutex_destroy 語(yǔ)法,。 pthread_mutex_destroy 語(yǔ)法int pthread_mutex_destroy(pthread_mutex_t *mp); #include <pthread.h> pthread_mutex_t mp; int ret; ret = pthread_mutex_destroy(&mp); 請(qǐng)注意,,沒(méi)有釋放用來(lái)存儲(chǔ)互斥鎖的空間。 pthread_mutex_destroy 返回值pthread_mutex_destroy() 在成功完成之后會(huì)返回零,。其他任何返回值都表示出現(xiàn)了錯(cuò)誤,。如果出現(xiàn)以下任一情況,該函數(shù)將失敗并返回對(duì)應(yīng)的值,。
|
|