執行緒同步1 互斥鎖

2021-08-11 18:24:19 字數 1556 閱讀 7496

和多程序相比,多執行緒的最大特點就是資源的共享。然而共享卻涉及到乙個同步的問題,這是多執行緒程式設計的難點。linux系統提供了多種方式處理執行緒間的同步問題,主要有互斥鎖、條件變數和非同步訊號。本文先講互斥鎖。

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

使用互斥鎖前必須對其進行初始化。有以下2種方式:

將巨集結構常量pthread_mutex_initializer賦給互斥鎖。pthread_mutex_t mutex=pthread_mutex_initializer。

另外是通過pthread_mutex_init函式初始化互斥鎖。

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
mutexattr表示互斥鎖的屬性,如果為null使用預設屬性。

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

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

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

pthread_mutex_unlock用來解鎖,其原型為:

int pthread_mutex_unlock(pthread_mutex_t *mutex);
解鎖要滿足兩個條件:一是互斥鎖必須處於加鎖的狀態;二是解鎖的執行緒也必須是當初加鎖的執行緒。解鎖後如果有其他執行緒在等待互斥鎖,則等待佇列中的第乙個執行緒將獲得互斥鎖。

互斥鎖使用完畢後,必須進行清除。清除互斥鎖使用函式pthread_mutex_destroy,該函式原型為:

int pthread_mutex_destroy(pthread_mutex_t *mutex);
清除鎖時要求鎖處於開放的狀態,清除成功返回0;否則函式返回ebusy。

以下例子演示通過互斥鎖對全域性變數在2個執行緒之間進行同步:

#include #include //宣告鎖和全域性變數

pthread_mutex_t number_mutex;

int globalnumber;

//執行緒1

void thread1()

}//執行緒2

void thread2()

}main()

執行結果:

執行緒同步 互斥鎖

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

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...