執行緒同步的方法之互斥鎖

2021-10-05 03:20:07 字數 2009 閱讀 1889

互斥鎖通過鎖機制來實現執行緒間的同步。在同一時刻只允許乙個執行緒執行乙個關鍵部分**。

互斥鎖函式 函式

功能pthread_mutex_init 函式

初始化乙個互斥鎖

pthread_mutex_destroy函式

登出乙個互斥鎖

pthread_mutex_lock 函式

加鎖,如果不成功,阻塞等待

pthread_mutex_unlock 函式

解鎖pthread_mutex_trylock 函式

測試枷鎖,如果不成功則立即返回,錯誤碼ebusy

使用互斥鎖之前必須先進行初始化操作,一種是靜態賦值法,將巨集結構常量pthread_mutex_initializer賦給互斥鎖,操作語句如下:

pthread_mutex_t mutex = pthread_mutex_initializer;
另外一種方式是通過pthread_mutex_init 函式初始化互斥鎖,該函式的原型如下:

int

pthread_mutex_init

(pthread_mutex_t *mutex,

const pthread_mutex_t *mutexattr)

;//mutexattr表示互斥鎖的屬性,如果為null則使用預設屬性。

互斥鎖的屬性

屬性值意義pthread_mutex_timed_np

普通鎖:當乙個執行緒加鎖後,其餘請求鎖的執行緒形成等待佇列,解鎖後按優先順序獲得鎖

pthread_mutex_recursive_np

巢狀鎖:允許乙個執行緒對同乙個鎖加鎖多次,並通過多次unlock解鎖。如果是不同執行緒請求,則在解鎖時重新競爭

pthread_mutex_errorcheck_np

檢錯鎖:在同乙個執行緒請求同乙個鎖的情況下,返回edeadlk,否則執行的動作與型別pthread_mutex_timed_np相同

pthread_mutex_adaptive_np

適應鎖:解鎖後重新競爭

初始化以後,就可以給互斥鎖加鎖了。加鎖有兩個函式:pthread_mutex_lock()和pthread_mutex_trylock()。原型如下:

int

pthread_mutex_lock

(pthread_mutex_t *mutex)

;int

pthread_mutex_trylock

(pthread_mutex_t *mutex)

;

用pthread_mutex_lock()加鎖時,如果mutex已經被鎖住,當前嘗試加鎖的執行緒就會阻塞,直到互斥鎖被其他執行緒釋放。當pthread_mutex_lock()函式返回時,說明互斥鎖已經被當前執行緒成功加鎖。pthread_mutex_trylock()函式則不同,如果mutex已經被加鎖,他將立即返回,返回的錯誤碼為ebusy,而不是阻塞等待。

函式pthread_mutex_unlock用來解鎖,函式原型如下:

int

pthread_mutex_unlock

(pthread_mutex_t *mutex)

;

用函式pthread_mutex_unlock解鎖時,要滿足兩個條件:一是互斥鎖必須處於加鎖狀態,二是呼叫本函式的執行緒必須是給互斥鎖加鎖的執行緒。解鎖後如果有其他執行緒在等待互斥鎖,等待佇列中的第乙個執行緒將獲得互斥鎖。

當乙個互斥鎖使用完畢後,必須使用pthread_mutex_destroy函式進行清除。該函式原型如下:

int

pthread_mutex_destroy

(pthread_mutex_t *mutex)

;

清除鎖時要求當前處於開放狀態,若鎖處於鎖定狀態,函式返回ebusy,成功時返回0。

例:

執行緒同步之互斥鎖

為什麼要執行緒同步?當多執行緒共享相同的記憶體的時候,需要每乙個執行緒看到相同的檢視。當乙個執行緒被修改時,其他的執行緒也可以修改或者讀取這個變數,所以就需要對這些執行緒同步,保證不會訪問到無效的變數。舉個例子 由此可見,執行緒同步的重要性。執行緒同步之互斥鎖的函式 1.include 2.int ...

Linux 執行緒同步方法 互斥鎖

在單執行緒條件下,由於對資料操作,在同樣的時間下,只有乙個執行緒來操作。所以不用擔心資料的同步問題。現代的作業系統,大都提供併發機制,雖然有時候是表面的併發。在 linux 中,併發用的最多的是基於執行緒的併發,程序的代價太高了,這樣,乙個共享的資料,在同一時間內,可能有多個執行緒在操作。如果沒有同...

多執行緒同步之互斥鎖

對於多執行緒程式來說,同步是指在一定的時間內只允許某乙個執行緒訪問某個資源 而在 此時間內,不允許其他的執行緒訪問該資源。同步資源的方式 互斥鎖 條件變數 讀寫鎖 訊號量。下面介紹下互斥鎖 將互斥鎖想象成乙個只能容納乙個人的洗手間,當某個人進入洗手間的時候,可以從 裡面將洗手間鎖上,其他人只能在互斥...