四、互斥鎖屬性
執行緒和執行緒的同步物件(互斥量,讀寫鎖,條件變數)都具有屬性。在修改屬性前都需要對該結構進行初始化。使用後要把該結構**。我們用pthread_ mutexattr_init函式對pthread_mutexattr結構進行初始化,用pthread_mutexattr_destroy函式對該結構進行**。 4
名稱::
pthread_mutexattr_init/pthread_mutexattr_destroy
功能:初始化/**pthread_mutexattr_t結構
標頭檔案:
#include
函式原形:
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
函式原形:
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
函式原形:
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、互斥量的本質是序列執行。如果很多執行緒需要領繁地加鎖同乙個互斥量,
則執行緒的大部分時間就會在等待,這對效能是有害的。如果互斥量保護的資料(或**)包含彼此無關的片段,則可以特大的互斥量分解為幾個小的互斥量來提高效能。這樣,任意時刻需要小互斥量的執行緒減少,執行緒等待時間就會減少。所以,互斥量應該足夠多(到有意義的地步),每個互斥量保護的區域則應盡量的少。
Posix多執行緒程式設計學習筆記(四) 互斥量(1)
一 什麼是互斥鎖 另一種在多執行緒程式中同步訪問手段是使用互斥量。程式設計師給某個物件加上一把 鎖 每次只允許乙個執行緒去訪問它。如果想對 關鍵部分的訪問進行控制,你必須在進入這段 之前鎖定一把互斥量,在完成操作之後再開啟它。互斥量函式有 pthread mutex init 初始化乙個互斥量 pt...
Posix多執行緒程式設計學習筆記(四) 互斥量(1)
一 什麼是互斥鎖 另一種在多執行緒程式中同步訪問手段是使用互斥量。程式設計師給某個物件加上一把 鎖 每次只允許乙個執行緒去訪問它。如果想對 關鍵部分的訪問進行控制,你必須在進入這段 之前鎖定一把互斥量,在完成操作之後再開啟它。互斥量函式有 pthread mutex init 初始化乙個互斥量 pt...
Posix多執行緒程式設計學習筆記(五) 條
一 什麼是條件變數 與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條...