互斥鎖通過鎖機制來實現執行緒間的同步。在同一時刻只允許乙個執行緒執行乙個關鍵部分**。
互斥鎖函式 函式
功能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 中,併發用的最多的是基於執行緒的併發,程序的代價太高了,這樣,乙個共享的資料,在同一時間內,可能有多個執行緒在操作。如果沒有同...
多執行緒同步之互斥鎖
對於多執行緒程式來說,同步是指在一定的時間內只允許某乙個執行緒訪問某個資源 而在 此時間內,不允許其他的執行緒訪問該資源。同步資源的方式 互斥鎖 條件變數 讀寫鎖 訊號量。下面介紹下互斥鎖 將互斥鎖想象成乙個只能容納乙個人的洗手間,當某個人進入洗手間的時候,可以從 裡面將洗手間鎖上,其他人只能在互斥...