生產者與消費者模型 及 條件變數

2021-09-01 21:00:46 字數 1793 閱讀 7101

生產者與消費者問題 及 條件變數

什麼是生產者和消費者模型

生產者,顧名思義就是生產東西的人,而消費者就消費的人。在系統中,假設有一塊記憶體,生產者要向記憶體中放資料,而消費者要從記憶體區域中拿資料。這片記憶體區域可以被所有的執行緒訪問,所以這片記憶體區域就是臨界資源,而在對臨界區的訪問時,要保證不會出錯,必須每次對臨界區的訪問是互斥的。所以當有許多生產者消費者時,每次只能有乙個生產者放資料,也只能有乙個消費者拿資料,也就是說該記憶體區域每次只能被乙個執行緒訪問。因此,生產者與生產者之間存在著互斥的關係,而消費者與消費者之間也是互斥的關係,在消費者和生產者之間也存在互斥的關係。除此之外,生產者和消費者之間還有一種關係,我們講在該記憶體區域中,生產者向其中放資料,消費者拿資料。但當消費者把其中的資料拿完之後,消費者可能會不斷的獲得鎖釋放鎖,造成生產者的飢餓問題,所以必須要保持兩者之間的同步,讓兩者之間要按照特定的順序訪問。

當存放的資料為滿時,生產者必須等待到可以有乙個位置存放資料。當存放資料的位置為空時,消費者必須等待有乙個位置已經有資料。而為了解決這些問題要使用條件

變數。

三種關係

條件變數

條件變數是為了解決同步的問題。

加入當生產者因為存放資料的區域已經滿了,從而要等待有空位時才開始放,但是生產者並不知道何時有空位,因此必須要被通知,可以放資料。條件變數解決了 讓生產消費者進行等待,和被喚醒的機制,以此來實現同步。

條件變數中提供了幾個函式來完成這些操作

條件變數的初始化

pthread_cond_init(pthread_cond_t *restrict, const pthread_condattr_t *restrict attr)

cond: 要初始化的條件變數

attr:屬性設定為空

條件變數的銷毀
pthread_cond_destroy(pthread_cond_t *cond)
等待條件變數的滿足
pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)

cond:在該條件變數上進行等待

mutex:互斥量

條件變數必須要和互斥鎖一起使用,當等待條件變數時,必須先要釋放鎖(否則會導致,其他的執行緒無法使用鎖,造成死鎖),等從等待的條件變數返回時,必須要先獲得鎖。

喚醒等待
int pthread_cond_broadcast(pthread_cond_t *cond)

//喚醒所有在該條件變數下等待的所有執行緒

int pthread_cond_signal(pthread_cond_t *cond)

//喚醒該條件變數下的乙個執行緒,等待佇列中的第乙個執行緒

pthread_cond_t 和 pthread_mutex_t

都在其內部維持了乙個等待佇列,來存放等待的執行緒

為什麼在pthread_cond_wait中需要互斥量?

一般的使用規範

pthread_mutex_lock(&lock);

while(條件不滿足) //函式可能會呼叫失敗,所以使用while進行二次檢測

pthread_cond_wait(cond , mutex);

//操作

pthread_mutex_unlock(&lock);

生產者與消費者模型

先介紹幾個函式 生產消費者模型 二者共享資料value,這裡,生產者是producter,消費者是consumer。生產者負責放物品到value中,消費者使用wait 等待生產者的通知。當得到通知後,消費者取出物品,並且用notify 通知生產者,可以再放下一批物品。例項 package cn.ed...

生產者與消費者模型

如圖 一共有三種關係 生產者與生產者的互斥關係,消費者與消費者的互斥關係,生產者與消費者的互斥且同步關係。兩種角色 生產者 執行緒 與消費者 執行緒 乙個交易場所 倉庫 一段記憶體空間,且可存可取 二 基於單向鍊錶的生產者消費者模型 1 我們這裡用乙個單鏈表當做那段共享記憶體,簡單實現生產者消費者模...

生產者與消費者模型

生產者 消費者模型描述的是有一塊緩衝區作為倉庫,生產者可將產品放入倉庫,消費者可以從倉庫中取出產品,模型圖如下所示 1 三種關係 三種關係分別指的是 消費者和消費者,生產者和生產者,生產者和消費者 其中消費者和消費者,生產者和生產者之間都屬於競爭關係,生產者和消費者之間的關係相當於是一種食物鏈之間的...