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