文章目錄
- 建立與銷毀
- 對pthread_mutexattr_t的維護
- 鎖操作
- 其它
建立與銷毀
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr)
struct pthread_mutexattr_t{enum lock_type // 使用pthread_mutexattr_settype來更改{PTHREAD_MUTEX_TIMED_NP [default]//當一個線程加鎖後,其餘請求鎖的線程形成等待隊列,在解鎖後按優先順序獲得鎖。PTHREAD_MUTEX_ADAPTIVE_NP// 動作最簡單的鎖類型,解鎖後所有線程重新競爭。PTHREAD_MUTEX_RECURSIVE_NP// 允許同一線程對同一鎖成功獲得多次。當然也要解鎖多次。其餘線程在解鎖時重新競爭。PTHREAD_MUTEX_ERRORCHECK_NP// 若同一線程請求同一鎖,返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP動作相同。} type;} attr;// 若NULL則使用預設屬性
int pthread_mutex_destroy (pthread_mutex_t * mutex)
在Linux中,互斥鎖不佔用任何資源,因此該函數只檢查鎖狀態,若為鎖定則返回EBUSY。
對pthread_mutexattr_t的維護
int pthread_mutexattr_init (pthread_mutexattr_t * attr);int pthread_mutexattr_destroy (pthread_mutexattr_t * attr);int pthread_mutexattr_getpshared (const pthread_mutexattr_t * attr, int * pshared);int pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, int pshared);int pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind);int pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int * kind);
鎖操作
- 不論哪種類型的鎖,都不可能被兩個不同的線程同時得到,而必須等待解鎖。
- 對於普通鎖和適應鎖類型,解鎖者可以是同進程內任何線程
- 對於嵌套鎖,文檔和實現要求必須由加鎖者解鎖,但實驗結果表明並沒有這種限制
- 檢錯鎖必須由加鎖者解鎖才有效,否則返回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);//在鎖已經被佔據時返回EBUSY而不是掛起等待
其它
- POSIX線程鎖機制的Linux實現都不是取消點,因此,延遲取消類型的線程不會因收到取消訊號而離開加鎖等待。
- 線程在加鎖後解鎖前被取消,鎖將永遠保持鎖定狀態。因此如果在關鍵區段內有取消點存在,或者設定了非同步取消類型,則必須在退出回呼函數中解鎖。
- 鎖機制不是非同步訊號安全的,也就是說,不應該在訊號處理過程中使用互斥鎖,否則容易造成死結。