生產者與消費者問題 及 條件變數
什麼是生產者和消費者模型
生產者,顧名思義就是生產東西的人,而消費者就消費的人。在系統中,假設有一塊記憶體,生產者要向記憶體中放資料,而消費者要從記憶體區域中拿資料。這片記憶體區域可以被所有的執行緒訪問,所以這片記憶體區域就是臨界資源,而在對臨界區的訪問時,要保證不會出錯,必須每次對臨界區的訪問是互斥的。所以當有許多生產者消費者時,每次只能有乙個生產者放資料,也只能有乙個消費者拿資料,也就是說該記憶體區域每次只能被乙個執行緒訪問。因此,生產者與生產者之間存在著互斥的關係,而消費者與消費者之間也是互斥的關係,在消費者和生產者之間也存在互斥的關係。除此之外,生產者和消費者之間還有一種關係,我們講在該記憶體區域中,生產者向其中放資料,消費者拿資料。但當消費者把其中的資料拿完之後,消費者可能會不斷的獲得鎖釋放鎖,造成生產者的飢餓問題,所以必須要保持兩者之間的同步,讓兩者之間要按照特定的順序訪問。
當存放的資料為滿時,生產者必須等待到可以有乙個位置存放資料。當存放資料的位置為空時,消費者必須等待有乙個位置已經有資料。而為了解決這些問題要使用條件三種關係變數。
條件變數
條件變數是為了解決同步的問題。條件變數中提供了幾個函式來完成這些操作加入當生產者因為存放資料的區域已經滿了,從而要等待有空位時才開始放,但是生產者並不知道何時有空位,因此必須要被通知,可以放資料。條件變數解決了 讓生產消費者進行等待,和被喚醒的機制,以此來實現同步。
條件變數的初始化
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 三種關係 三種關係分別指的是 消費者和消費者,生產者和生產者,生產者和消費者 其中消費者和消費者,生產者和生產者之間都屬於競爭關係,生產者和消費者之間的關係相當於是一種食物鏈之間的...