生產者 消費者問題

2021-10-06 23:51:06 字數 2599 閱讀 4458

1 問題描述

系統中有一組生產者程序和一組消費者程序,生產者程序每次生產乙個產品放入緩衝區,消費者程序每次從緩衝區中取出乙個產品並使用。(注:這裡的「產品」理解為某種資料)

2 問題分析

生產者、消費者共享乙個初始為空、大小為n的緩衝區。

只有緩衝區沒滿時,生產者才能把產品放入緩衝區,否則必須等待。

緩衝區沒滿→生產者生產 ---------同步關係

只有緩衝區不空時,消費者才能從中取出產品,否則必須等待。

緩衝區沒空→消費者消費 ---------同步關係

緩衝區是臨界資源,各程序必須互斥地訪問。--------- 互斥關係

同步關係分析:前v後p

pv操作分析步驟:關係分析。找出題目中描述的各個程序,分析它們之間的同步、互斥關係。

整理思路。根據各程序的操作流程確定p、v操作的大致順序。

設定訊號量。並根據題目條件確定訊號量初值。(互斥訊號量初值一般為1,同步訊號量的初始值要看對應資源的初始值是多少)

2 問題描述

由以上分析,可知生產者-消費者問題中訊號量設定:

semaphore mutex =1;

//互斥訊號量,實現對緩衝區的互斥訪問

semaphore empty = n;

//同步訊號量,表示空閒緩衝區的數量

semaphore full =0;

//同步訊號量,表示產品的數量,也即非空緩衝區的數量

同步模型:

問題模型:

生產者生產商品,然後判斷緩衝區是否為空(p一下空閒緩衝區),把產品放入後(v一下產品數量。通知消費者程序)

消費者首先判斷有沒有商品(p一下商品數量),從緩衝區中取出產品後(v一下空閒緩衝區。通知生產者程序),進而消耗商品

還需要實現各個程序對緩衝區的互斥訪問

生產者程序每次要消耗(p)乙個空閒緩衝區,並生產(v)乙個產品

消費者程序每次消耗(p)乙個產品,並釋放乙個空閒緩衝區(v)

pv一對

pv一對

3 **實現
semaphore mutex =1;

//互斥訊號量,實現對緩衝區的互斥訪問

semaphore empty = n;

//同步訊號量,表示空閒緩衝區的數量

semaphore full =0;

//同步訊號量,表示產品的數量,也即非空緩衝區的數量

producer()

}consumer()

}

4 分析總結
能否改變相鄰p、v操作的順序?

分析: 若此時緩衝區內已經放滿產品,則empty=0,full=n。 則生產者程序執行① 使mutex變為0,再執行②,由於已沒有空閒緩衝區,因此生產者被阻塞。

由於生產者阻塞,因此切換回消費者程序。消費者程序執行③,由於mutex為0,即生產者還沒釋放對臨界資源的「鎖」,因此消費者也被阻塞。

這就造成了生產者等待消費者釋放空閒緩衝區,而消費者又等待生產者釋放臨界區的情況,生產者和消費者迴圈等待被對方喚醒,出現「死鎖」。

同樣的,若緩衝區中沒有產品,即full=0,empty=n。按③④① 的順序執行就會發生死鎖。

因此,實現互斥的p操作一定要在實現同步的p操作之後,如果交換會產生死鎖現象。

v操作不會導致程序阻塞,因此兩個v操作順序可以交換。

生產者消費者問題是乙個互斥、同步的綜合問題。

包含了一對互斥,兩對同步

緩衝區為空,生產者生產需要在消費者消費之前,因此在生產者生產之後執行v操作(前v,即前面操作之後執行v操作),在消費者消費之前,執行p操作(後p,即後面操作之前執行p操作)

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...

生產者 消費者問題

1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...