生產者消費者問題分析

2021-06-18 01:56:27 字數 2598 閱讀 1809

pv

操作是由

p操作原語和

v操作原語組成的,對訊號量進行操作,具體定義如下: p

(s):

(1)申請資源,將訊號量的值減1,

s=s-1。

(2)如果s>=0

,則該程序繼續執行,否則程序置為等待狀態,排入等待佇列。 v

(s):

(1)釋放資源,將訊號量

s的值加1,

s=s+1。

(2)如果s>0

,則該程序繼續執行,否則釋放佇列中第乙個等待訊號量的程序。

利用pv

操作能夠實現程序的兩種情況,同步和互斥。生產者和消費者問題可以分為三種情況來分析。

(1) 

乙個生產者,乙個消費者,公用乙個緩衝區。 定義

兩個同步訊號量:

empty

:表示緩衝區是否為空,初值為1。

full

:表示緩衝區是否為滿,初值為0。

生產者程序:

while(true)

消費者程序:

while(true)

(2) 

乙個生產者,乙個消費者,公用

n個環形緩衝區。

定義兩個同步訊號量:

empty

:表示緩衝區是否為空,初值為n。

full

:表示緩衝區是否為滿,初值為0。

定義緩衝區的編號為0到

n-1。定義兩個指標

in,out

。分別是生產者程序和消

費者程序使用的指標,指向下乙個可用的緩衝區。

生產者程序:

while(true)

消費者程序:

while(true)

(3) 

一組生產者,一組消費者,公用

n個環形緩衝區。

此時生產者和消費者之間存在同步關係,各個生產者,各個消費者之間存在互斥關係。

定義兩個同步訊號量,兩個互斥訊號量:

empty

:表示緩衝區是否為空,初值為n。

full

:表示緩衝區是否為滿,初值為0。

mutex1

:生產者之間的互斥訊號量,初值為1。

mutex2

:消費者之間的互斥訊號量,初值為1。

定義緩衝區的編號為0到

n-1。定義兩個指標

in,out

。分別是生產者程序和消

費者程序使用的指標,指向下乙個可用的緩衝區。

生產者程序:

while(true)

消費者程序:

while(true)

#include

#include

const unsigned short size_of_buffer = 10; //

緩衝區長度

unsigned short productid = 0; //

產品號unsigned short consumeid = 0; //

將被消耗的產品號

unsigned short in = 0; //

產品進緩衝區時的緩衝區下標

unsigned short out = 0; //

產品出緩衝區時的緩衝區下標

int g_buffer[size_of_buffer]; //

緩衝區是個迴圈佇列

bool g_continue = true; //

控制程式結束

handle g_hmutex; //

用於執行緒間的互斥

handle g_hfullsemaphore; //

當緩衝區滿時迫使生產者等待

handle g_hemptysemaphore; //

當緩衝區空時迫使消費者等待

dword winapi producer(lpvoid); //

生產者執行緒

dword winapi consumer(lpvoid); //

消費者執行緒

int main()}

return 0;}

//生產乙個產品。簡單模擬了一下,僅輸出新產品的id號

void produce() //

把新生產的產品放入緩衝區 //

輸出緩衝區當前的狀態

for (int i=0;i

生產";

if (i==out) std::cout << " <--

消費";

std::cout << std::endl;}}

//從緩衝區中取出乙個產品

void take()}

//消耗乙個產品

void consume() //

生產者

//消費者

dword winapi consumer(lpvoid lppara)

return 0;}

有乙個需要特別注意的地方:如果生產者和消費者使用同乙個互斥訊號量。那麼要注意同步訊號量與互斥訊號量的申請與釋放順序。如果某時緩衝區為空,某個消費者鎖上

mutex

,然後等待

p(full)

,此時生產者會在

p(mutex)

時阻塞,導致死鎖的發生。

生產者消費者問題

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 ...