天天看點

線程間互斥:mutex

#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

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

int pthread_mutex_destroy (pthread_mutex_t *mutex );

int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);

int pthread_mutexattr_init(pthread_mutexattr_t *attr);

destroy and initialize the mutex attributes object。

int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)

int pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)

指定是該程序與其他程序的同步還是同一程序内不同的線程之間的同步。可以設定為PTHREAD_PROCESS_SHARE和PTHREAD_PROCESS_PRIVATE。預設是後者,表示程序内使用鎖

pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)

pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)

PTHREAD_MUTEX_TIMED_NP,這是預設值,也就是普通鎖。當一個線程加鎖以後,其餘請求鎖的線程将形成一個等待隊列,并在解鎖後按優先級獲得鎖。這種鎖政策保證了資源配置設定的公平性。

PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,并通過多次unlock解鎖。如果是不同線程請求,則在加鎖線程解鎖時重新競争。

PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個線程請求同一個鎖,則傳回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相同。這樣就保證當不允許多次加鎖時不會出現最簡單情況下的死鎖。

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

int pthread_mutex_lock (pthread_mutex_t *mutex );

int pthread_mutex_trylock (pthread_mutex_t *mutex );

int pthread_mutex_unlock (pthread_mutex_t *mutex );

線程調用該函數讓互斥鎖上鎖,如果該互斥鎖已被另一個線程鎖定和擁有,則調用該線程将阻塞,直到該互斥鎖變為可用為止。