天天看點

linux 互斥鎖

     在多線程控制中,可以通過互斥鎖,實作多個線程對共享資源的單獨通路。在同一時刻,隻有一個線程能夠掌握互斥鎖,隻有這個線程能夠對共享資源進行通路,其他線程被阻塞,直到互斥鎖被釋放。      如果,互斥鎖上鎖期間,有多個線程阻塞,那麼所有被阻塞的線程會被設定為可執行狀态。第一個執行的線程,取得互斥鎖的控制權,上鎖。其他線程繼續阻塞。     一  建立互斥鎖            互斥鎖可以被靜态建立或動态建立。      靜态建立:           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

繼續閱讀