就像執行緒具有屬性一樣,用於執行緒互斥的互斥量的也有相應的屬性,互斥量屬性的資料型別是用pthread_mutexattr_t結構來表示的,在使用互斥量前必須初始化。
建立互斥量有兩種方法:靜態建立和動態建立。對於靜態建立而言,posix定義了乙個巨集pthread_mutex_initializer來靜態初始化互斥量,使用方法如下:
pthread_mutex_t mutex = pthread_mutex_initializer;
對於動態建立互斥量則是使用pthread_mutex_init函式初始化互斥量,引數attr用於指定互斥量的屬性,互斥量用完對應的要呼叫pthread_mutex_destroy函式銷毀互斥量,具體如何動態建立互斥量,前面已經介紹了,這裡就不再贅述了(參考:27-執行緒同步——互斥量)。
pthread_mutexattr_t是互斥鎖屬性的資料型別,表示互斥鎖的一些屬性相關的資訊。
//初始化互斥鎖屬性
pthread_mutexattr_init
(pthread_mutexattr_t attr)
;//銷毀互斥鎖屬性
pthread_mutexattr_destroy
(pthread_mutexattr_t attr)
;//用於獲取互斥鎖屬性
intpthread_mutexattr_getpshared
(const pthread_mutexattr_t *restrict attr ,
int*restrict pshared)
;//用於設定互斥鎖屬性
intpthread_mutexattr_setpshared
(pthread_mutexattr_t *attr ,
int pshared)
;
引數說明:
attr表示互斥鎖屬性
pshared表示互斥量的共享屬性有以下兩種值可取:
pthread_process_private:鎖只能用於乙個程序內部的兩個執行緒進行排斥(預設情況)。
pthread_process_shared:鎖可用於兩個不同程序中的執行緒進行排斥,使用還需要在共享記憶體中分配互斥量,然後再為互斥量指定該屬性就可以了。
//獲取互斥鎖型別
intpthread_mutexattr_gettype
(const pthread_mutexattr_t *restrict attr ,
int*restrict type)
;//設定互斥鎖型別
intpthread_mutexattr_settype
(const pthread_mutexattr_t *restrict attr ,
int type)
;
引數type表示互斥鎖型別,總共有以下幾種型別:
pthread_mutex_normal:標準互斥鎖,第一次上鎖成功,第二次上鎖會失敗並阻塞。
pthread_mutex_recursive:遞迴互斥鎖,第一次上鎖成功,第二次上鎖還是會成功,可以理解為內部有乙個計數器,每加一次鎖+1,解鎖-1。
pthread_mutex_errorcheck:檢錯互斥鎖,第一次上鎖會成功,第二次上鎖會出錯,不會阻塞
pthread_mutex_default:預設互斥鎖,第一次上鎖會成功,第二次上鎖會失敗
#include
#include
#include
#include
intmain
(int argc ,
char
*args)
//定義互斥鎖屬性
pthread_mutexattr_t mutexattr;
//初始化互斥鎖屬性
pthread_mutexattr_init
(&mutexattr)
;//設定互斥鎖型別,error:檢錯互斥鎖,normal:標準互斥鎖,recursive:遞迴互斥鎖if(
!strcmp
(args[1]
,"error"))
elseif(
!strcmp
(args[1]
,"normal"))
elseif(
!strcmp
(args[1]
,"recursive"))
//初始化互斥鎖
pthread_mutex_init
(&mutex ,
&mutexattr)
;//第一次上鎖if(
pthread_mutex_lock
(&mutex)!=0
)else
//第二次上鎖if(
pthread_mutex_lock
(&mutex)!=0
)else
//加鎖幾次,同樣也要釋放幾次
pthread_mutex_unlock
(&mutex)
;pthread_mutex_unlock
(&mutex)
;//銷毀互斥鎖屬性和互斥鎖
pthread_mutexattr_destroy
(&mutexattr)
;pthread_mutex_destroy
(&mutex)
;return0;
}
./pthread_lock_type error,設定檢錯互斥鎖:
檢錯互斥鎖第一次加鎖會成功,第二次加鎖會失敗返回錯誤資訊,並不會阻塞。
./pthread_lock_type normal,設定標準互斥鎖:
第一次加鎖會成功,第二次加鎖會失敗並阻塞。
./pthread_lock_type recursive,設定遞迴互斥鎖:
遞迴互斥鎖第一次加鎖會成功,第二次加鎖也會成功,內部會計數。
執行緒 互斥鎖
include include include include include 1.靜態初始化,當動態初始化時,遮蔽靜態初始化 pthread mutex t mutex pthread mutex initializer 2.動態初始化 pthread mutex t mutex int lock...
執行緒互斥鎖
執行緒互斥鎖 降低效率,保證資料安全 執行緒 資料共享 修改共享資料,資料不安全 from threading import thread,lock import time n 100 deftask global n temp n time.sleep 0.1 n temp 1 if name m...
執行緒同步與互斥 互斥鎖
在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...