執行緒同步之互斥鎖

2021-08-22 19:04:03 字數 1413 閱讀 7350

為什麼要執行緒同步?

當多執行緒共享相同的記憶體的時候,需要每乙個執行緒看到相同的檢視。當乙個執行緒被修改時,其他的執行緒也可以修改或者讀取這個變數,所以就需要對這些執行緒同步,保證不會訪問到無效的變數。

舉個例子:

由此可見,執行緒同步的重要性。

執行緒同步之互斥鎖的函式:

> 1. #include 

> 2. int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);

> 3. int pthread_mutex_destroy(pthread_mutex_t *mutex);

> 4. int pthread_mutex_lock(pthread_mutex_t *mutex);

> 5. int pthread_mutex_trylock(pthread_mutex_t *mutex);

> 6. int pthread_mutex_unlock(pthread_mutex_t *mutex);

​ 這些函式第乙個引數mutex指向要操作的目標互斥鎖,成功時返回0,出錯返回錯誤碼

l pthread_process_shared。互斥鎖可以被跨程序共享。

l pthread_process_private。互斥鎖只能被和鎖的初始化執行緒隸屬於同乙個程序的執行緒共享。

互斥鎖屬性type指定互斥鎖的型別。linux支援如下4種型別的互斥鎖:

l pthread_mutex_normal,普通鎖。這是互斥鎖預設的型別。當乙個執行緒對乙個普通鎖加鎖以後,其餘請求該所的執行緒將形成乙個等待佇列,並在該所解鎖後按優先順序獲得它。這種鎖型別保證了資源分配的公平性。但這種鎖也很容易引發問題:乙個執行緒如果對乙個已經加鎖的普通鎖再次加鎖,將引發死鎖;對乙個已經被其他執行緒加鎖的普通鎖解鎖,或者對乙個已經解鎖的普通鎖解鎖將導致不可預期的後果。

l pthread_mutex_errorcheck,檢錯鎖。乙個執行緒如果對乙個已經加鎖的檢錯鎖再次加鎖,則加鎖操作返回edeadlk。對乙個已經被其讓他執行緒加鎖的檢錯鎖解鎖,或者對乙個已經解鎖的檢錯鎖再次解鎖,則檢錯鎖返回eperm。

l pthream_mutex_recursive,巢狀鎖。這種鎖允許乙個執行緒在釋放鎖之前對他加鎖而不發生死鎖。不過其他執行緒如果要獲得這個鎖,則當前鎖的擁有者必須執行相應次數的解鎖操作。對乙個已經被其他執行緒枷鎖的巢狀鎖解鎖,或者對乙個已經解鎖的巢狀鎖再次解鎖,則解鎖操作返回eperm。

l pthread_mutex_default,預設鎖。乙個執行緒如果對乙個已經加鎖的預設鎖再次加鎖,或者對乙個已經被其他執行緒加鎖的預設鎖解鎖,或者對乙個已經解鎖的預設鎖再次解鎖,將導致不可預期的後果。

多執行緒同步之互斥鎖

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

執行緒同步 互斥鎖

一 為什麼要用多執行緒?避免阻塞 乙個程序如果只有乙個執行緒的話,當這個乙個執行緒阻塞則就整個程序阻塞,無法再去完成其他事情。提高效率,避免cpu空 程式經常涉及讀寫操作就會訪問磁碟,這些操作的速度比cpu慢的多,而為了等待這些操作的響應,cpu又不能去幹其他的事情或者處理新的請求,導致這種單執行緒...

linux執行緒》同步互斥機制之 互斥鎖

本文基於訊號量 如果訊號量的值最多為1,那實際上相當於乙個共享資源在任意時刻最多只能有乙個執行緒在訪問,這樣的邏輯稱為 互斥 這時,有一種更加方便和語義更加準確的工具來滿足這種邏輯 互斥鎖。幾個執行緒同時去搶乙個鎖,誰搶到了鎖就進門把房間鎖上,訪問資料,出來後之前解鎖。照這樣的邏輯,互斥鎖的操作無非...