互斥鎖和條件變量

互斥鎖和條件變量

產生背景:線程的最大特點是資源共享,在多線程的編程裏面,多個線程對於臨界變量的修改,就出現了同步問題;互斥鎖和條件變量是解決這個問題的常用辦法。

互斥鎖:

通過鎖機制來實現線程間數據的同步,在同一時刻通常只允許一個關鍵部分的代碼。

使用例子:
pthread_mutex_lock (&mutex); //加鎖
printf(" a = %d\n", a);
a++;
pthread_mutex_unlock (&mutex);//解鎖
中間爲:臨界數據

在使用之前,要對互斥鎖進行初始化:

初始化方式:1、靜態賦值法:
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITALIZER;
           2、使用函數動態賦值法:
    int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr *mutexattr);

互斥鎖常用操作函數:

函數 功能
pthread_mutex_init 初始化
pthread_mutex_lock 加鎖,如果不成功,阻塞等待
pthread_mutex_unlock 解鎖
pthread_mutex_trylock 測試加鎖,不加成則立即返回,錯誤碼爲EBUSY
pthread_mutex_destroy 註銷一個鎖

1、如果對已經被加鎖的鎖變量嘗試加鎖,去嘗試加鎖的線程就會阻塞(掛起),直到互斥鎖被加鎖線程解鎖。
2、使用pthread_mutex_unlock 解鎖的兩個條件:互斥鎖處於加鎖狀態;解鎖函數必須是給互斥鎖加鎖的線程。
3、當一個互斥鎖使用完成後,必須對它進行清除。(清除互斥鎖代表釋放它所佔的資源)
4、當一個線程試圖以另一個線程相反的順序鎖住互斥量的時候,就出現死鎖。

條件變量:

條件變量:是利用線程間共享的全局變量進行同步的一種機制
與互斥鎖不同,條件變量是用來等待而不是用來上鎖的。條件變量用來自動阻塞一個線程,直到某特殊情況發生爲止。通常條件變量和互斥鎖同時使用。

主要包括兩個動作:
一個線程等待”條件變量的條件成立”而掛起;
另一個線程使”條件成立”(給出條件成立信號).
爲了防止競爭,條件變量的使用總是和一個互斥鎖結合在一起。

條件變量常用操作函數:

函數 功能
pthread_cond_init 初始化條件變量
pthread_cond_wait 基於條件變量阻塞,無條件等待
pthread_cond_timewait 阻塞到指定事件的發生,計時等待
pthread_cond_broadcast 解除所有線程等待
pthread_cond_destroy 清除條件變量

在使用之前,要對條件變量進行初始化:

初始化方式:1、靜態賦值法:
    pthread_cond_t cond = PTHREAD_COND_INITALIZER;
           2、使用函數動態賦值法:
    int pthread_cond_init (pthread_cond_t *cond, const pthread_condattr *condattr);(condattr通常是條件變量的屬性,由於並沒有得到實現,通常值爲NULL)

當一個條件變量不再使用的時候,需要將其清除。清除一個條件變量調用pthread_cond_destroy 實現。(只有在沒有線程等待該條件變量的時候才能清除這個條件變量)

發佈了36 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章