互斥鎖和條件變數

2021-08-27 10:20:35 字數 1830 閱讀 4551

條件變數

執行緒最大的特點就是資源的共享性,然而資源共享中的同步問題是多執行緒程式設計的難點。互斥鎖通過鎖機制來實現執行緒間的同步。使用互斥鎖前必須進行初始化操作。初始化有兩種方式:一種是靜態賦值法,將將巨集結構常量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則使用預設屬性。

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

用pthread_mutex_lock()加鎖時,如果mutex已經被鎖住,當前嘗試加鎖的執行緒就會阻塞,直到互斥鎖被釋放。當

pthread_mutex_lock函式返回時,說明互斥鎖已經被當前執行緒成功加鎖。pthread_mutex_trylock函式則不同,如果mutex已經加鎖,它將立即返回,返回的錯誤碼為ebusy,而不是阻塞等待。

注:加鎖時,不論哪種型別的鎖,都不可能被兩個不同的執行緒同時得到,其中乙個必須等待解鎖。在同一程序中的執行緒,如果加鎖後沒有解鎖,則其他執行緒將無法再獲得該鎖。

函式pthread_mutex_unlock(pthread_mutex_t *mutex);

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

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

int pthread_mutex_destroy(pthread_mutex_t *mutex);

清除乙個互斥鎖意味著釋放它所占用的資源,清除鎖是要求當前處於開放狀態,若鎖處於鎖定狀態,函式返回ebusy,該函式成功時返回哦0。由於在linux中,互斥鎖並不占用記憶體,因此pthread_mutex_destory()除了解除互斥鎖的狀態以外沒有其他操作。

下面是我寫的乙個小例子。

#include

#include//引入執行緒標頭檔案

int wu=0; //全域性變數

pthread_mutex_t mut; //定義互斥鎖變數

void thread(void) //執行緒1對全域性變數做3333次自增操作

}void thread2(void) //

}int main()

if(ret2!=0)

for(i=0;i<3;i++)

pthread_join(id,null); //等待執行緒1結束

pthread_join(id2,null); //等待執行緒2結束

printf("wu=%d\n",wu);

return (0);

}[root@wuzhq thread]# ls

******1.c th_ex th_pool thread_example.c thread_pool.c

[root@wuzhq thread]# gcc -o ******1 ******1.c -lpthread(這塊的-lpthread不能缺少)

執行,得出wu=5555,始終為5555。試著把互斥鎖去掉,會發現,結果每次都不一樣,多數情況下都小於5555,這就是執行緒間搶占資源造成的結果。下次再聊

互斥鎖和條件變數

互斥瑣 定義 指代相互排斥,最基本的同步形式。用於保護臨界區,以保證任何時刻只有乙個執行緒或乙個程序在執行其中的 上鎖 pthread mutex lock 臨界區解鎖 pthread mutex unlock 條件變數 定義 用於等待訊號,同步的另一種手段。每乙個條件變數總有乙個互斥瑣與之關聯。等...

互斥鎖和條件變數

mutex體現的是一種競爭,我離開了,通知你進來。cond體現的是一種協作,我準備好了,通知你開始吧。互斥鎖乙個明顯的缺點是它只有兩種狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,它常和互斥鎖一起配合使用。使用時,條件變數被用來阻塞乙個執行緒,當...

互斥鎖和條件變數

一直以來都理解錯了,不是使用條件變數再加上一對互斥鎖,而是條件變數內部引入乙個互斥鎖,其實主要還是條件變數在起作用,這樣會提高效率,看下面的例子。while true thread 2 while true pthread mutex unlock mutex 這種實現下,就算 lock 空閒,th...