一、問題描述
生產(chǎn)者-消費者問題是一個經(jīng)典的進程同步問題,該問題最早由Dijkstra提出,用以演示他提出的信號量機制.
他要求設計在同一個進程地址空間內(nèi)執(zhí)行的兩個線程.
生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費.
消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū).
當生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū).
當消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來.
同理 本問題也是要求設計在同一個進程地址空間內(nèi)執(zhí)行的兩個線程.
當車站售票廳達到20人上線時,必須等有人走出車站售票廳,車站售票廳外的購票者才可進入.就如上面
生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū).此時廳外購票者進入大廳這個事件可以看做是一個生產(chǎn)者線程,而廳內(nèi)購票者走出廳外這個事件就可以看做是一個消費者線程.如此問題迎刃而解.
二、實現(xiàn)代碼
#include
#include
const unsigned short SIZE_OF_BUFFER = 10; //緩沖區(qū)長度
unsigned short ProductID = 0; //產(chǎn)品號
unsigned short ConsumeID = 0; //將被消耗的產(chǎn)品號
unsigned short in = 0; //產(chǎn)品進緩沖區(qū)時的緩沖區(qū)下標
unsigned short out = 0; //產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標
int g_buffer[SIZE_OF_BUFFER]; //緩沖區(qū)是個循環(huán)隊列
bool g_continue = true; //控制程序結(jié)束
HANDLE g_hMutex; //用于線程間的互斥
HANDLE g_hFullSemaphore; //當緩沖區(qū)滿時迫使生產(chǎn)者等待
HANDLE g_hEmptySemaphore; //當緩沖區(qū)空時迫使消費者等待
DWORD WINAPI Producer(LPVOID); //生產(chǎn)者線程
DWORD WINAPI Consumer(LPVOID); //消費者線程
int main()
{
//創(chuàng)建各個互斥信號
g_hMutex = CreateMutex(NULL,FALSE,NULL);
g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
//調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當生產(chǎn)者個數(shù)多于消費者個數(shù)時,
//生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待
const unsigned short PRODUCERS_COUNT = 3; //生產(chǎn)者的個數(shù)
const unsigned short CONSUMERS_COUNT = 1; //消費者的個數(shù)
//總的線程數(shù)
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
DWORD producerID[CONSUMERS_COUNT]; //生產(chǎn)者線程的標識符
DWORD consumerID[THREADS_COUNT]; //消費者線程的標識符
//創(chuàng)建生產(chǎn)者線程
for (int i=0;i
操作系統(tǒng)中的信號量機制問題
操作系統(tǒng)中的信號量機制問題
某車站售票廳,任何時刻最多可容納20名購票者進入,當售票廳中少于20名購票者時,廳外的購票者可立即進入,否則需要在外面等待.每個購票者可看成一個進程.
要求:再寫C語言代碼 要完整的
某車站售票廳,任何時刻最多可容納20名購票者進入,當售票廳中少于20名購票者時,廳外的購票者可立即進入,否則需要在外面等待.每個購票者可看成一個進程.
要求:再寫C語言代碼 要完整的
其他人氣:839 ℃時間:2020-07-05 22:35:03
優(yōu)質(zhì)解答
我來回答
類似推薦
- 操作系統(tǒng)中,如果信號量的當前值為負數(shù),則表示系統(tǒng)中在該信號量上有多少個等待進程,為什麼
- 一道關于操作系統(tǒng)的題目,是臨界區(qū)問題還是信號量問題?請寫出代碼?
- 仿照 I imagine (that) a lot of people will come to the food festival.寫四個句子.
- 現(xiàn)在在高一.初中英語和基本沒學.現(xiàn)在補英語的話能補上么.還有就是我現(xiàn)在有一套新概念.我是以新概念為主還是課本呢.現(xiàn)在學校發(fā)的題90%看不明白.要是補的話能不能有希望啊.
- 17.Because air pollution has been greatly reduced,this city is still _______.
- 一棵樹在離地面9米處斷裂,樹的頂部落在離底部12米處,這棵樹折斷之前是多少米.
- 一道除法算式中,被除數(shù)加上除數(shù),與商的積是80,被除數(shù)是
- 物體做初速度為零的勻加速直線運動,在第3S、第4S內(nèi)的總位移是1.2M,則第5S內(nèi)的位移是多少?
- 魯迅《雪》閱讀答案,
- 試比較雙子葉植物莖和單子葉植物莖初生結(jié)構(gòu)的不同
- 下列物質(zhì)放置在空氣中,變質(zhì)原因與其他有本質(zhì)區(qū)別的是 Na NaOH Na2SO3 Na2O2
- 下周他將要給朋友寫信 英文
猜你喜歡
- 18(x一6.2)=41.6這方程咋解
- 2請問情態(tài)動詞和助動詞有哪些 他們有什么區(qū)別?是不是情態(tài)動詞和助動詞后面都要跟動詞原形?
- 3硝酸鉀屬于復合肥嗎
- 4I'm sure you are b_____ .you can stay at home by yourself.
- 5"瘠"怎么讀
- 6送別同學的詩歌
- 7________ _________ does it take to go from my home to the school by car?Twenty minutes.
- 8寫一篇英語短文,10句,描述一只動物
- 9they的賓格形式
- 10競選班長發(fā)言稿400字左右
- 11有小學生、中學生和大學生共405人參加節(jié)目聯(lián)歡會,他們?nèi)藬?shù)的比是2:三分之一:1.要算式,
- 12英語翻譯