在線程實際運行過程當中,咱們常常須要多個線程保持同步。這時能夠用互斥鎖來完成任務; 互斥鎖的使用過程當中,主要有 pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock 這幾個函數以完成鎖的初始化,鎖的銷燬,上鎖和釋放鎖操做。函數
一,鎖的建立測試
鎖能夠被動態或靜態建立,能夠用宏PTHREAD_MUTEX_INITIALIZER來靜態的初始化鎖,採用這種方式比較容易理解,互斥鎖是pthread_mutex_t的結構體,而這個宏是一個結構常量,以下能夠完成靜態的初始化鎖:spa
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;線程
另外鎖能夠用pthread_mutex_init函數動態的建立,函數原型以下:隊列
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)進程
二,鎖的屬性資源
互斥鎖屬性能夠由pthread_mutexattr_init(pthread_mutexattr_t *mattr);來初始化,而後能夠調用其餘的屬性設置方法來設置其屬性;get
互斥鎖的範圍:能夠指定是該進程與其餘進程的同步仍是同一進程內不一樣的線程之間的同步。能夠設置爲PTHREAD_PROCESS_SHARE和 PTHREAD_PROCESS_PRIVATE。默認是後者,表示進程內使用鎖。可使用int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)原型
pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)同步
用來設置與獲取鎖的範圍;
互斥鎖的類型:有如下幾個取值空間:
PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當一個線程加鎖之後,其他請求鎖的線程將造成一個等待隊列,並在解鎖後按優先級得到鎖。這種鎖策略保證了資源分配的公平性。
PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,容許同一個線程對同一個鎖成功得到屢次,並經過屢次unlock解鎖。若是是不一樣線程請求,則在加鎖線程解鎖時從新競爭。
PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,若是同一個線程請求同一個鎖,則返回EDEADLK,不然與PTHREAD_MUTEX_TIMED_NP類型動做相同。這樣就保證當不容許屢次加鎖時不會出現最簡單狀況下的死鎖。
PTHREAD_MUTEX_ADAPTIVE_NP,適應鎖,動做最簡單的鎖類型,僅等待解鎖後從新競爭。
能夠用
pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)
獲取或設置鎖的類型。
三,鎖的釋放
調用pthread_mutex_destory以後,能夠釋放鎖佔用的資源,但這有一個前提上鎖當前是沒有被鎖的狀態。
四,鎖操做
對鎖的操做主要包括加鎖 pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試加鎖 pthread_mutex_trylock()三個。
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而不是掛起等待
五,鎖的使用
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex ; void *print_msg(void *arg){ int i=0; pthread_mutex_lock(&mutex); for(i=0;i<15;i++){ printf("output : %d\n",i); usleep(100); } pthread_mutex_unlock(&mutex); } int main(int argc,char** argv){ pthread_t id1; pthread_t id2; pthread_mutex_init(&mutex,NULL); pthread_create(&id1,NULL,print_msg,NULL); pthread_create(&id2,NULL,print_msg,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); pthread_mutex_destroy(&mutex); return 1; }