1. 程式人生 > >Linux 線程鎖 pthread_mutex_t

Linux 線程鎖 pthread_mutex_t

互斥 libc tro linux 競爭 pre glibc int erro

1)初始化線程鎖

靜態初始化:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

或者動態初始化:

int pthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t* attr);

其中 attr 用於指定互斥鎖屬性,如果為NULL則使用缺省屬性。 函數成功執行後,互斥鎖被初始化為未鎖住態。


2)鎖的操作

2.1)加鎖:

int pthread_mutex_lock(pthread_mutex_t*mutex);int pthread_mutex_trylock(pthread_mutex_t
*mutex);

pthread_mutex_trylock() 方式在鎖被占用的時候不會阻塞,而是返回EBUSY

2.2)釋放鎖:

int pthread_mutex_unlock(pthread_mutex_t*mutex);

2.3)銷毀鎖:

int pthread_mutex_destroy(pthread_mutex_t*mutex);

銷毀一個互斥鎖即意味著釋放它所占用的資源,且要求鎖當前處於開放狀態。 由於在Linux中,互斥鎖並不占用任何資源,因此LinuxThreads中的 pthread_mutex_destroy() 除了檢查鎖狀態以外(鎖定狀態則返回EBUSY)沒有其他動作。


3)鎖的屬性

互斥鎖的屬性在創建鎖的時候指定,在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

適應鎖,動作最簡單的鎖類型,僅等待解鎖後重新競爭。

Linux 線程鎖 pthread_mutex_t