程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第一百零五回:C語言實例--生產者與消費者問題一)

一起talk C栗子吧(第一百零五回:C語言實例--生產者與消費者問題一)

編輯:關於C語言

一起talk C栗子吧(第一百零五回:C語言實例--生產者與消費者問題一)


各位看官們,大家好,上一回中咱們說的是進程知識體系圖的例子,並且畫了一張知識體系圖。這一回咱們說的例子是:生產者與消費者問題。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

生產者與消費者問題是經典的進程間通信例子,經常被用來解釋進程間通信。接下來我們就介紹一下什麼是生產者與消費者問題:

1.生產者與消費者問題概述

有一個容量為C池子,用來存放產品。

生產者A不斷地向池子中存放生產完成的產品,並且判斷產品是否已經達到池子的容量C,如果產品數量達到池子的容量C,那麼生產者停止生產,並且等待消費者從池子中取走產品。

消費者B不斷地從池子中取走產品,並且判斷池子中是否有產品,如果池子中沒有產品,那麼消費者停止取走產品,並且等待生產者生產產品。

2.生產者與消費者問題實現

我們介紹一下實現生產與消費者問題的思路:

生產者和消費者都是進程,因此需要有進程,而且需要兩個進程。 生產者有生產產品的動作,消費者有取走產品的動作,這兩個動作需要有序進行,因此需要使用進程同步。 生產者和消費都都會對池子進行存放/取走產品的操作,可見池子是一個臨界區,因此需要使用進程間通信,並且需要通過進程同步來控制進程間的通信。

我們來做個總結:為了實現生產者與消費者問題,我們需要創建/結束進程;還需要進程間通信,進程通信可以在前面章回中介紹的管道,共享內存,消息隊列中選取一種通信方式;最後使用信號量對進程通信進行同步操作。

大家可以看到生產者與消費者問題使用了與進程相關的所有知識,可以看作是對進程知識的綜合應用。我們在前面章回中總結和整理了進程的知識體系圖,如果忘記的話,可以查看。

下面是生產者與消費者問題的偽代碼,請大家參考:

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);
    }
}

各位看官,關於生產者與消費者問題的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved