pthread_mutex_t之注意事項

這篇文章專門提醒那些習慣了在Windows中開發的,vc++中的互斥鎖(criticalsection)是屬於嵌套鎖,在Linux中要去設置其對應屬性。


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而不是掛起等待。


sample example:

pthread_mutexattr_t   mt;

pthread_mutex_t   lock;

pthread_mutexattr_init(&mt);

pthread_mutexattr_settype(&mt, PTHREAD_MUTEX_RECURSIVE_NP);

pthread_mutex_lock(&lock);

.... .....

pthread_mutex_unlock(&lock);




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章