生產者與消費者問題是經典的進程間通信例子,經常被用來解釋進程間通信。接下來我們就介紹一下什麼是生產者與消費者問題:
有一個容量為C池子,用來存放產品。
生產者A不斷地向池子中存放生產完成的產品,並且判斷產品是否已經達到池子的容量C,如果產品數量達到池子的容量C,那麼生產者停止生產,並且等待消費者從池子中取走產品。
消費者B不斷地從池子中取走產品,並且判斷池子中是否有產品,如果池子中沒有產品,那麼消費者停止取走產品,並且等待生產者生產產品。
我們介紹一下實現生產與消費者問題的思路:
生產者和消費者都是進程,因此需要有進程,而且需要兩個進程。 生產者有生產產品的動作,消費者有取走產品的動作,這兩個動作需要有序進行,因此需要使用進程同步。 生產者和消費都都會對池子進行存放/取走產品的操作,可見池子是一個臨界區,因此需要使用進程間通信,並且需要通過進程同步來控制進程間的通信。我們來做個總結:為了實現生產者與消費者問題,我們需要創建/結束進程;還需要進程間通信,進程通信可以在前面章回中介紹的管道,共享內存,消息隊列中選取一種通信方式;最後使用信號量對進程通信進行同步操作。
大家可以看到生產者與消費者問題使用了與進程相關的所有知識,可以看作是對進程知識的綜合應用。我們在前面章回中總結和整理了進程的知識體系圖,如果忘記的話,可以查看。
下面是生產者與消費者問題的偽代碼,請大家參考:
produce()
{
while(true)
{
p(sem); //使用P/V操作來進行進程同步與互斥
if(count < C) //判斷產品數量是否小於池子容量
{
produce(); //生產產品,並且存放到池子中
count++;
}
else
break; //產品數量等於池子容量時停止生產,等待消費者取走產品
v(sem);
}
}
customer()
{
while(true)
{
p(sem); //使用P/V操作來進行進程同步與互斥
if(count > 0) //判斷池子中是否有產品
{
custome(); //從池子中取走產品
count--;
}
else
break; //池子中產品數量等於零時停止取走產品,等待生產者生產產品
v(sem);
}
}
各位看官,關於生產者與消費者問題的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。