生產者和消費者問題

2021-07-04 16:18:03 字數 1514 閱讀 9681

有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個具有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,顯然生產者和消費者之間必須保持同步,是即不允許消費者到乙個空的緩衝區中取產品,也不允許生產者向乙個已經放入產品的緩衝區中再次投放產品.

利用記錄型訊號量解決生產者-消費者問題

先來看一段偽**(訊號量機制原理)

var mutex,empty,full:semaphore:=1,n,0;  // 定義三個訊號量

buffer:array[0,...,n-1]of item; // 定義緩衝池,容量為n

in,out:integer:=0,0;

begin

parbegin

proceducer:begin // 生產者

repeat..

.producer an item nextp; // 生產乙個產品..

.wait(empty); // 申請乙個空緩衝區

wait(mutex); // 申請緩衝池的使用權

buffer(in):=nextp; // 將產品放入緩衝池中

signal(mutex); //釋放緩衝池使用權

signal(full); // 釋放乙個滿緩衝區

until false;

endconsumer:begin

repeat

wait(full); //申請乙個滿緩衝區

wait(mutex); // 申請緩衝池的使用權

nextc:=buffer(out); //從緩衝池中取出產品

signal(mutex); //釋放緩衝池使用權

signal(empty); //釋放乙個空緩衝區

consumer the item in nextc; //消費乙個產品

until false;

endparend

end

nextp 應該是next proceducer的意思

nextc 應該是next consumer的意思.

至於生產者程序如何被阻塞和喚醒,因為程式中有乙個 repeat語句,所以程序不斷測試緩衝池是否有空緩衝區,以及緩衝池是否有其他程序使用。若兩個條件不滿足,則進入阻塞佇列等待。若某一時刻兩個條件都能滿足,則能喚醒該程序。

未完成

利用and訊號量解決生產者和消費者問題

@@@@

利用管程解決生產者和消費者問題

@@@@

生產者和消費者問題

package 生產者消費者 public class producerconsumertest package 生產者消費者 生產者執行緒,負責生產公共資源 author dream public class producerthread implements runnable override ...

生產者和消費者問題

package com.softeem.lesson22.sync3 public class mobile public intgetnum public void setnum int num package com.softeem.lesson22.sync3 public class sto...

生產者和消費者問題

同學面試有遇到這個問題,說面試官很刁,答的不好。於是,我也翻了翻書,頓感有做筆記的必要。概述 生產者和消費者問題是關於同步的乙個經典問題,即由乙個或多個生產者 執行緒或程序 建立資料,然後由乙個或多個消費者 執行緒或程序 處理。這裡自然涉及到ipc。一 單生產者 單消費者 最簡單的同步模型,以she...