互斥2-生產者消費者(原始狀態)

一,休眠與喚醒
1,經典的生產者與消費者問題
生產者消費者現象的原型是這樣的:
一個生產者生產,當緩衝區滿了,就自己休眠
一個消費者消費,當緩衝區空了,就自己休眠

一個生產者生產,當生產一個產品時,就喚醒消費者(可以消費了)
一個消費者消費,當消費一個產品時,就喚醒生產者(可以生產了)

無論是生產者,還是消費着,當被喚醒的時候不一定馬上執行,還需要獲得cpu

◎這種設計產生了一個問題,原因是需要一個count來記錄產品個數,而count的獲得並沒有互斥
例如如下情況:
消費者取得count=0,但是還沒來得及休眠自己的時候,發生了系統進程調度,切換到生產者
生產者生產了一個產品後,喚醒消費者,但是這個時候的消費者並沒有休眠,所以喚醒丟失
然後生產者繼續生產,直到緩衝滿了,自動休眠。
但是這個時候的消費者也是休眠狀態,沒有人來喚醒他,所以兩個都一直休眠下去。

解決方案:
提供一個標誌位,當生產者發送喚醒給消費者的時候,記錄下來爲1,當消費者要休眠之前檢查一下這個標誌位,如果是1就不休眠,如果不是就休眠
這個方法暫時解決了問題,考慮一下。
如果是m個生產者,n個消費者,m,n又很大的情況下,標誌位就太多了。
這種情況下情況下地解決辦法見下一篇文章 <互斥3-生產者消費者>

這個方案地實現程序如下:
#define N=100
int count=0;
void product(void){
 int item;
 while(TRUE){
  item=produce_item()
  if(count==N)sleep();
  insert_item(item);
  count=count+1;
  if (count==1)wakeup(consumer);
 }
}
void consumer(void){
 int item;
 while(TRUE){
  if(count==0)sleep();
  item=remove_item();
  count=count-1;
  if(count==N-1)wakeup(product);
  consume_item(item);
 }

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