生產者 消費者問題

2021-06-21 23:24:03 字數 1322 閱讀 4864

生產者-消費者問題是乙個經典的

程序同步問題,該問題最早由dijkstra提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執行緒從緩衝區中獲得物品,然後釋放緩衝區。當生產者執行緒生產物品時,如果沒有空緩衝區可用,那麼生產者執行緒必須等待消費者執行緒釋放出乙個空緩衝區。當消費者執行緒消費物品時,如果沒有滿的緩衝區,那麼消費者執行緒將被阻塞,直到新的物品被生產出來。

#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//從緩衝區中取出乙個產品

void take()

//消費者

dword winapi consumer(lpvoid lppara)

return 0;

}需要注意的地方:

如果將兩個wait操作即wait(full)和wait(mutex)互換位置,或者將release(mutex)與release(full)互換位置,當緩衝區存滿產品時,生產者又生產了一件產品,它欲向緩衝區存放時將在empty上等待,但它已經占有了使用緩衝區的權利。這時消費者要取產品時將停留在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 ...