31 執行緒屬性 互斥鎖型別

2021-08-28 09:24:50 字數 3059 閱讀 8962

就像執行緒具有屬性一樣,用於執行緒互斥的互斥量的也有相應的屬性,互斥量屬性的資料型別是用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 執行緒二需要...