linux多執行緒之互斥量和條件變數

2021-08-11 13:49:36 字數 2908 閱讀 8615

在linux多執行緒程式設計開發中最基本概念主要包含三點:執行緒,互斥鎖,條件變數

執行緒:執行緒的建立,退出,等待 3 種。(這次主題不是這,就不細說了)

互斥鎖:包括 4 種操作,分別是建立,銷毀,加鎖和解鎖。

條件變數:有 5 種操作:建立,銷毀,觸發,廣播和等待。

其中互斥鎖和條件變數基本上是一起使用,其原因是互斥鎖乙個明顯的缺點是它只有兩種狀態:鎖定和非鎖定。(拿最經典的生產者和消費者模型來說,當生存的速度跟不上消費的速度,就有大量的消費者執行緒在鎖前阻塞),而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足。

相應api

互斥鎖api:

建立:對於靜態分配的互斥量, 可以把它設定為pthread_mutex_initializer, 或者調 用pthread_mutex_init

init原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restric attr);

銷毀:int pthread_mutex_destroy(pthread_mutex_t *mutex);

加鎖:int pthread_mutex_lock(pthread_mutex_t *mutex);

解鎖:int pthread_mutex_unlock(pthread_mutex_t *mutex);

返回值: 成功則返回0, 出錯則返回錯誤編號.

條件變數api:

建立:條件變數和互斥鎖一樣,都有靜態動態兩種建立方式,靜態方式使用 pthread_cond_initializer常量,如下:

pthread_cond_t cond=pthread_cond_initializer

動態方式呼叫cond初始化函式pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr)

銷毀:pthread_cond_destroy(pthread_cond_t *cond)

觸發:pthread_cond_signal (pthread_cond_t *cond);

廣播:pthread_cond_broadcast (pthread_cond_t *cond);

等待:pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)

pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)

相互聯絡

互斥鎖的作用:互斥鎖(也叫互斥量),它的作用是用來保護一段區域,使之成為一塊臨界區,讓其進行原子操作。工作原理簡單的來說就是當有執行緒來訪問這一塊臨界區的時候,就會試圖獲得這把鎖,如果這把鎖被其他執行緒拿到的話,就會被阻塞,直到這把鎖被釋放。

(適用場景:如果買票系統最後只有一張票了,有n個執行緒同時買這張票,可能導致只有一張票,卻有多個買到的客戶)

條件變數的作用:在上面的場景中,票的**不能滿足客戶的需求,就會使拿不到鎖的執行緒一直在等待的佇列中阻塞,導致資源浪費。(也就是買票人員一直在車站等待)。而條件變數是一種同步機制,讓條件滿足的時候(就是沒票了,你可以先去做你自己的事情)允許執行緒掛起,直到共享資料上的某些條件得到滿足(票製作完畢,通知你可以買票了)。然後它將通知相應的條件變數喚醒乙個或多個正被此條件變數阻塞的執行緒(通知可以買票了)。這些執行緒將重新鎖定互斥鎖並重新測試條件是否滿足(最好用while再判斷一次,防止假醒)。

3. **體現

經典的消費者生產者模型

讓我們先用通俗的話來描述整個流程是:

消費者:

第一步:pthread_mutex_lock->對臨界區進行加鎖

第二步: while 沒貨物的時候:pthread_cond_wait 讓消費者進行等待(這裡其實3個動作的合集,1讓這個執行緒把鎖丟掉(解鎖),2使執行緒休眠,等代pthread_cond_signal傳送訊號,3重新獲得鎖(加鎖))

第三步:買東西

第四步:pthread_mutex_unlock->對臨界區進行解鎖

生產者:

第一步:pthread_mutex_lock->對臨界區進行加鎖(用的拿起消費者pthread_cond_wait丟掉的鎖)

第二步:製作貨物,完畢後pthread_cond_signal傳送訊號,自己上鎖,告訴消費者可與獲得鎖了

第三步:pthread_mutex_unlock->對臨界區進行解鎖

**片段

#include

#include

#include

pthread_mutex_t mutex = pthread_mutex_initializer;//初始化互斥鎖

pthread_cond_t cond = pthread_cond_initializer;//初始化條件變數

void *produce(void *arg);

void *consume(void *arg);

int goods=1;//貨物

int main(void)

pthread_join(t_a, null);//等待生產者結束

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

pthread_mutex_destroy(&mutex);//銷毀鎖

pthread_cond_destroy(&cond);//銷毀條件變數

exit(0);

}void *produce(void *arg)

pthread_exit(0);

}void *consume(void *arg)

pthread_exit(0);

}

多執行緒之Mutex 互斥量

include include include long g count 0 long g sum 0 static const int g s count 10 critical section g csthreadparamer critical section g csthreadcode h...

Linux 多執行緒互斥量互斥

同乙個程序中的多個執行緒共享所在程序的記憶體資源,當多個執行緒在同一時刻同時訪問同一種共享資源時,需要相互協調,以避免出現資料的不一致和覆蓋等問題,執行緒之間的協調和通訊的就叫做執行緒的同步問題,執行緒同步的思路 讓多個執行緒依次訪問共享資源,而不是並行 mutex被建立時可以有初始值,表示mute...

多執行緒 互斥量 訊號量和條件變數

通常用於互斥訪問 pthread mutex t m mutex pthread mutex intit m mutex,null pthread mutex lock m mutex pthread mutex unlock m mutex pthread mutex destory m mute...