對pthread_cond_wait的理解

目錄

 

pthread_cond_wait出現的目的

pthread_cond_wait實現之中爲什麼要加鎖和解鎖

代碼之中爲什麼要用while


函數原型

int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);

pthread_cond_wait:調用其函數有三個步驟 

1、對其傳入的mutex進行解鎖

2、等待pthread_cond_signal的喚醒(阻塞在這裏)

3、喚醒後重新對其進行加鎖

 

pthread_cond_wait出現的目的

如果不存在信號量,則生產者和消費者可能是這個樣子(圖片來自https://blog.csdn.net/shichao1470/article/details/89856443)

apue上這樣解釋:這就關閉了條件檢查和線程進入休眠(休眠一段時間再次進行檢查)狀態等待這兩個操作之間的時間通道,也就是說,條件一旦滿足,直接就喚醒了消費者,不需要睡眠那段時間

pthread_cond_wait實現之中爲什麼要加鎖和解鎖

解鎖:我的理解是,如果有兩個線程,A線程是生產者線程,B線程是消費者線程如果B線程先到鎖,執行到pthread_cond_wait,如果沒有解鎖,直接阻塞,那麼A線程(生產者)永遠也沒有機會拿到鎖,造成永久堵塞,因爲鎖一直沒B線程(消費者)佔用     

加鎖:我理解就是讓線程A(生產者)thread_cond_signal ----->到unlock之間代碼可以及時執行,因爲只有unlock之後, B線程中pthread_cond_wait 內部才能夠加鎖成功,   還有一點就是返回前再次鎖mutex是爲了保證線程從pthread_cond_wait返回後到再次條件判斷前不被改變, 就是A拿到鎖了,消費過程中其他線程是不允許消費的

代碼之中爲什麼要用while

lock(&mutex);
//一些操作
pthread_cond_signal(&cond);
//一些操作
unlock(&mutex);

上述爲生產者代碼,現在比如消費者線程有兩個,分別爲M,N,這兩個消費者同時阻塞在pthread_cond_wait上(一個消費者線程pthread_cond_wait解鎖後,鎖被其他消費者線程拿到,也到了pthread_cond_wait函數),如果消費者pthread_cond_signal了,因爲pthread_cond_signal只會喚醒pthread_cond_wait上的線程,那麼M,N同時被喚醒,M先拿到鎖,消費了,剛消費完解鎖後,N線程後拿到了鎖,此時沒有什麼可消費的了,條件不滿足了,只能用while,重新等待,這也就是所謂的  驚羣效應 

https://blog.csdn.net/lyztyycode/article/details/78648798 (驚羣效應比較好的文章)

代碼還有一種寫法是

lock(&mutex);
//一些操作
unlock(&mutex);
//一些操作
pthread_cond_signal(&cond);

這種寫法在執行完unlock之後,還沒來的及執行pthread_cond_signal,可能有一些空閒的線程直接消費了,那麼之後喚醒的線程也不滿足了,所以也要用while 

參考博客:https://blog.csdn.net/shichao1470/article/details/89856443

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章