互斥锁属性PTHREAD_MUTEX_RECURSIVE
四、互斥鎖屬性
???????線(xiàn)程和線(xiàn)程的同步對(duì)象(互斥量,讀寫(xiě)鎖,條件變量)都具有屬性。在修改屬性前都需要對(duì)該結(jié)構(gòu)進(jìn)行初始化。使用后要把該結(jié)構(gòu)回收。我們用pthread_ mutexattr_init函數(shù)對(duì)pthread_mutexattr結(jié)構(gòu)進(jìn)行初始化,用pthread_mutexattr_destroy函數(shù)對(duì)該結(jié)構(gòu)進(jìn)行回收。
?
4
| 名稱(chēng):: | pthread_mutexattr_init/pthread_mutexattr_destroy |
| 功能: | 初始化/回收pthread_mutexattr_t結(jié)構(gòu) |
| 頭文件: | #include <pthread.h> |
| 函數(shù)原形: | int pthread_mutexattrattr_init(pthread_mutexattr_t *attr); int pthread_mutexattrattr_destroy( pthread_mutexattr_t *attr ); |
| 參數(shù): | attr????pthread_mutexattr_t結(jié)構(gòu)變量 |
| 返回值: | 若成功返回0,若失敗返回錯(cuò)誤編號(hào)。 |
??????
?
?
???????pthread_mutexattr_init將屬性對(duì)象的值初始化為缺省值。并分配屬性對(duì)象占用的內(nèi)存空間。
attr中pshared屬性表示用這個(gè)屬性對(duì)象創(chuàng)建的互斥鎖的作用域,它的取值可以是PTHREAD_PROCESS_PRIVATE(缺省值,表示由這個(gè)屬性對(duì)象創(chuàng)建的互斥鎖只能在進(jìn)程內(nèi)使用)或PTHREAD_PROCESS_SHARED。
?
互斥量屬性分為共享互斥量屬性和類(lèi)型互斥量屬性。兩種屬性分別由不同的函數(shù)得到并由不同的函數(shù)進(jìn)行修改。pthread_mutexattr_getpshared和pthread_mutexattr_setpshared函數(shù)可以獲得和修改共享互斥量屬性。pthread_mutexattr_gettype和pthread_mutexattr_settype函數(shù)可以獲得和修改類(lèi)型互斥量屬性。下面我們分別介紹。
?
5
| 名稱(chēng):: | pthread_mutexattr_getpshared/pthread_mutexattr_setpshared |
| 功能: | 獲得/修改共享互斥量屬性 |
| 頭文件: | #include <pthread.h> |
| 函數(shù)原形: | int pthread_mutexattrattr_ getpshared ( const pthread_attr_t *restrict attr,int*restrict pshared); int pthread_mutexattrattr_ setpshared (??const pthread_attr_t *restrict attr,int pshared); |
| 參數(shù): | ? |
| 返回值: | 若成功返回0,若失敗返回錯(cuò)誤編號(hào)。 |
?
?
?
?
?
?
共享互斥量屬性用于規(guī)定互斥鎖的作用域。互斥鎖的域可以是進(jìn)程內(nèi)的也可以是進(jìn)程間的。pthread_mutexattrattr_ getpshared可以返回屬性對(duì)象的互斥鎖作用域?qū)傩浴?梢允且韵轮?#xff1a;PTHREAD_PROCESS_SHARED,PTHREAD_PROCESS_PRIVATE。如果互斥鎖屬性對(duì)象的pshared屬性被置PTHREAD_PROCESS_SHARED。那么由這個(gè)屬性對(duì)象創(chuàng)建的互斥鎖將被保存在共享內(nèi)存中,可以被多個(gè)進(jìn)程中的線(xiàn)程共享。如果pshared屬性被置為PTHREAD_PROCESS_PRIVATE,那么只有和創(chuàng)建這個(gè)互斥鎖的線(xiàn)程在同一個(gè)進(jìn)程中的線(xiàn)程才能訪(fǎng)問(wèn)這個(gè)互斥鎖。
?
6
| 名稱(chēng):: | pthread_mutexattr_gettype/pthread_mutexattr_settype |
| 功能: | 獲得/修改類(lèi)型互斥量屬性 |
| 頭文件: | #include <pthread.h> |
| 函數(shù)原形: | int pthread_mutexattrattr_ getpshared ( const pthread_attr_t *restrict attr,int*restrict pshared); int pthread_mutexattrattr_ setpshared (??const pthread_attr_t *restrict attr,int pshared); |
| 參數(shù): | ? |
| 返回值: | 若成功返回0,若失敗返回錯(cuò)誤編號(hào)。 |
?
?
?
?
?
?
?
?
?
?
?
pthread_mutexattr_gettype函數(shù)可以獲得互斥鎖類(lèi)型屬性。缺省的互斥鎖類(lèi)型屬性是PTHREAD_MUTEX_DEFAULT。
合法的類(lèi)型屬性值有:
PTHREAD_MUTEX_NORMAL;
PTHREAD_MUTEX_ERRORCHECK;
PTHREAD_MUTEX_RECURSIVE;
PTHREAD_MUTEX_DEFAULT。
類(lèi)型說(shuō)明:
PTHREAD_MUTEX_NORMAL
這種類(lèi)型的互斥鎖不會(huì)自動(dòng)檢測(cè)死鎖。如果一個(gè)線(xiàn)程試圖對(duì)一個(gè)互斥鎖重復(fù)鎖定,將會(huì)引起這個(gè)線(xiàn)程的死鎖。如果試圖解鎖一個(gè)由別的線(xiàn)程鎖定的互斥鎖會(huì)引發(fā)不可預(yù)料的結(jié)果。如果一個(gè)線(xiàn)程試圖解鎖已經(jīng)被解鎖的互斥鎖也會(huì)引發(fā)不可預(yù)料的結(jié)果。
?
PTHREAD_MUTEX_ERRORCHECK
這種類(lèi)型的互斥鎖會(huì)自動(dòng)檢測(cè)死鎖。如果一個(gè)線(xiàn)程試圖對(duì)一個(gè)互斥鎖重復(fù)鎖定,將會(huì)返回一個(gè)錯(cuò)誤代碼。如果試圖解鎖一個(gè)由別的線(xiàn)程鎖定的互斥鎖將會(huì)返回一個(gè)錯(cuò)誤代碼。如果一個(gè)線(xiàn)程試圖解鎖已經(jīng)被解鎖的互斥鎖也將會(huì)返回一個(gè)錯(cuò)誤代碼。
?
PTHREAD_MUTEX_RECURSIVE
如果一個(gè)線(xiàn)程對(duì)這種類(lèi)型的互斥鎖重復(fù)上鎖,不會(huì)引起死鎖,一個(gè)線(xiàn)程對(duì)這類(lèi)互斥鎖的多次重復(fù)上鎖必須由這個(gè)線(xiàn)程來(lái)重復(fù)相同數(shù)量的解鎖,這樣才能解開(kāi)這個(gè)互斥鎖,別的線(xiàn)程才能得到這個(gè)互斥鎖。如果試圖解鎖一個(gè)由別的線(xiàn)程鎖定的互斥鎖將會(huì)返回一個(gè)錯(cuò)誤代碼。如果一個(gè)線(xiàn)程試圖解鎖已經(jīng)被解鎖的互斥鎖也將會(huì)返回一個(gè)錯(cuò)誤代碼。這種類(lèi)型的互斥鎖只能是進(jìn)程私有的(作用域?qū)傩詾镻THREAD_PROCESS_PRIVATE)。
?
PTHREAD_MUTEX_DEFAULT
這種類(lèi)型的互斥鎖不會(huì)自動(dòng)檢測(cè)死鎖。如果一個(gè)線(xiàn)程試圖對(duì)一個(gè)互斥鎖重復(fù)鎖定,將會(huì)引起不可預(yù)料的結(jié)果。如果試圖解鎖一個(gè)由別的線(xiàn)程鎖定的互斥鎖會(huì)引發(fā)不可預(yù)料的結(jié)果。如果一個(gè)線(xiàn)程試圖解鎖已經(jīng)被解鎖的互斥鎖也會(huì)引發(fā)不可預(yù)料的結(jié)果。POSIX標(biāo)準(zhǔn)規(guī)定,對(duì)于某一具體的實(shí)現(xiàn),可以把這種類(lèi)型的互斥鎖定義為其他類(lèi)型的互斥鎖。
?
五、應(yīng)用互斥量需要注意的幾點(diǎn)
???????1、互斥量需要時(shí)間來(lái)加鎖和解鎖。鎖住較少互斥量的程序通常運(yùn)行得更快。所以,互斥量應(yīng)該盡量少,夠用即可,每個(gè)互斥量保護(hù)的區(qū)域應(yīng)則盡量大。
2、互斥量的本質(zhì)是串行執(zhí)行。如果很多線(xiàn)程需要領(lǐng)繁地加鎖同一個(gè)互斥量,
則線(xiàn)程的大部分時(shí)間就會(huì)在等待,這對(duì)性能是有害的。如果互斥量保護(hù)的數(shù)據(jù)(或代碼)包含彼此無(wú)關(guān)的片段,則可以特大的互斥量分解為幾個(gè)小的互斥量來(lái)提高性能。這樣,任意時(shí)刻需要小互斥量的線(xiàn)程減少,線(xiàn)程等待時(shí)間就會(huì)減少。所以,互斥量應(yīng)該足夠多(到有意義的地步),每個(gè)互斥量保護(hù)的區(qū)域則應(yīng)盡量的少。
總結(jié)
以上是生活随笔為你收集整理的互斥锁属性PTHREAD_MUTEX_RECURSIVE的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: localtime与localtime_
- 下一篇: 无锁编程[0]__多线程条件下的计数器_