一,鎖的建立
鎖可以被動態或靜態建立,可以用巨集pthread_mutex_initializer來靜態的初始化鎖,採用這種方式比較容易理解,互斥鎖是pthread_mutex_t的結構體,而這個巨集是乙個結構常量,如下可以完成靜態的初始化鎖:
pthread_mutex_t mutex = pthread_mutex_initializer;
另外鎖可以用pthread_mutex_init函式動態的建立,函式原型如下:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)
二,鎖的屬性
互斥鎖屬性可以由pthread_mutexattr_init(pthread_mutexattr_t *mattr);來初始化,然後可以呼叫其他的屬性設定方法來設定其屬性;
互斥鎖的範圍:可以指定是該程序與其他程序的同步還是同一程序內不同的執行緒之間的同步。可以設定為pthread_process_share和pthread_process_private。預設是後者,表示程序內使用鎖。可以使用int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)
pthread_mutexattr_getshared(
pthread_mutexattr_t *mattr,int *pshared)
用來設定與獲取鎖的範圍;
互斥鎖的型別:
有以下幾個取值空間:
pthread_mutex_timed_np,這是預設值,也就是普通鎖。當乙個執行緒加鎖以後,其餘請求鎖的執行緒將形成乙個等待佇列,並在解鎖後按優先順序獲得鎖。這種鎖策略保證了資源分配的公平性。
pthread_mutex_recursive_np,巢狀鎖,允許同乙個執行緒對同乙個鎖成功獲得多次,並通過多次unlock解鎖。如果是不同執行緒請求,則在加鎖執行緒解鎖時重新競爭。
pthread_mutex_errorcheck_np,檢錯鎖,如果同乙個執行緒請求同乙個鎖,則返回edeadlk,否則與pthread_mutex_timed_np型別動作相同。這樣就保證當不允許多次加鎖時不會出現最簡單情況下的死鎖。
pthread_mutex_adaptive_np,適應鎖,動作最簡單的鎖型別,僅等待解鎖後重新競爭。
可以用pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)
獲取或設定鎖的型別。
三,鎖的釋放
呼叫pthread_mutex_destory之後,可以釋放鎖占用的資源,但這有乙個前提上鎖當前是沒有被鎖的狀態。
四,鎖操作
對鎖的操作主要包括加鎖 pthread_mutex_lock()、解鎖pthread_mutex_unlock()和
測試加鎖 pthread_mutex_trylock()三個。
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
pthread_mutex_trylock()語義與pthread_mutex_lock()類似,不同的是在鎖已經被佔據時返回ebusy而不是掛起等待
五,鎖的使用
#include
#include
pthread_mutex_t mutex ;
void
*print_msg(
void
*arg)
pthread_mutex_unlock(&mutex);
} int
main(
intargc,
char
** argv)
#include #include pthread_mutex_t mutex ;
void *print_msg(void *arg)
pthread_mutex_unlock(&mutex);
}int main(int argc,char** argv)
將會乙個執行緒乙個執行緒的執行。 C語言多執行緒互斥鎖
互斥鎖是為了防止多個執行緒同時操作臨界資源,下面看看用法 include include pthread mutex t mute int value 0 void fun void arg int main for int i 0 i 5 i int rc pthread join threads...
C 實現mutex 互斥鎖
思路 實現mutex最重要的就是實現它的lock 方法和unlock 方法。我們儲存乙個全域性變數flag,flag 1表明該鎖已經鎖住,flag 0表明鎖沒有鎖住。實現lock 時,使用乙個while迴圈不斷檢測flag是否等於1,如果等於1就一直迴圈。然後將flag設定為1 unlock 方法就...
互斥鎖機制,互斥鎖與讀寫鎖區別
互斥鎖 mutex,用於保證在任何時刻,都只能有乙個執行緒訪問該物件。當獲取鎖操作失敗時,執行緒會進入睡眠,等待鎖釋放時被喚醒 讀寫鎖 rwlock,分為讀鎖和寫鎖。處於讀操作時,可以允許多個執行緒同時獲得讀操作。但是同一時刻只能有乙個執行緒可以獲得寫鎖。其它獲取寫鎖失敗的執行緒都會進入睡眠狀態,直...