在多線程控制中,可以通過互斥鎖,實作多個線程對共享資源的單獨通路。在同一時刻,隻有一個線程能夠掌握互斥鎖,隻有這個線程能夠對共享資源進行通路,其他線程被阻塞,直到互斥鎖被釋放。 如果,互斥鎖上鎖期間,有多個線程阻塞,那麼所有被阻塞的線程會被設定為可執行狀态。第一個執行的線程,取得互斥鎖的控制權,上鎖。其他線程繼續阻塞。 一 建立互斥鎖 互斥鎖可以被靜态建立或動态建立。 靜态建立: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 特别說明:在ubuntu14.04中,由于頭檔案中使用了ifdef條件編譯,3種鎖中隻有預設鎖可用。詳見頭檔案 pthread.h # define PTHREAD_MUTEX_INITIALIZER \
{ { 0, 0, 0, 0, 0, { __PTHREAD_SPINS } } }
# ifdef __USE_GNU //如果不定義use gnu 是沒有下面幾種鎖的
# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { __PTHREAD_SPINS } } }
# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { __PTHREAD_SPINS } } }
# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { __PTHREAD_SPINS } } }
動态建立: pthread_mutex_init函數動态的建立,函數原型如下: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr) 如pthread_mutex_init(mutex,NULL),使用預設值屬性初始化,此時為快速互斥鎖。
二 鎖的屬性 互斥鎖的由函數pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)來初始化。互斥鎖的屬性屬性類型為pthread_mutexattr_t,聲明後由函數pthread_mutexattr_init()來建立。之後調用pthread_mutexattr_settype函數來設定屬性,其函數原型為int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind);參數attr就是前面聲明的屬性變量,這是一個結構體;第二個參數kind是要設定的屬性,類型為int。這個參數的功能就是将kind的值傳入結構體attr中。kind可以是: (1)PTHREAD_MUTEX_FAST_NP//快速互斥鎖
(2)PTHREAD_MUTEX_RECURSIVE_NP//遞歸鎖
(3)PTHREAD_MUTEX_ERRORCHECK_NP//檢錯鎖 比較完整的使用非預設屬性的過程: pthread_mutex_t mutex; //聲明一個互斥鎖
pthread_mutexattr_t attr; //聲明一個互斥鎖屬性變量,這是一個結構體
pthread_mutexattr_init(&attr); //初始化attr
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP); //将屬性值傳入attr
pthread_mutex_init(&mutex,&attr); //利用設定好屬性的變量 attr
pthread_mutex_destroy(&attr); //釋放結構體attr