vc實現生產者消費者

2021-04-26 01:34:12 字數 2941 閱讀 1880

生產者消費者問題是乙個著名的程序同步問題。它的描述是:有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能併發執行,在兩者之間設定了乙個具有n個緩衝區的緩衝池,生產者程序將它所生產的產品放入乙個緩衝區中;消費者程序可從緩衝區中取走產品去消費。儘管所有的生產者程序和消費者程序都是以非同步方式執行,但它們之間必須保持同步,即不允許消費者程序到乙個空的緩衝區取產品,也不允許生產者程序向乙個已裝滿產品且尚未取走的緩衝區投放產品。

我們利用乙個陣列來表示上述具有n個緩衝區的迴圈緩衝池。用in來指示下乙個可投放產品的緩衝區,每當生產者程序生產並投放乙個產品後,in下移;用out來指示下乙個可從中獲取產品的緩衝區,每當消費者程序取走乙個產品後,out下移。利用訊號量原語wait()和release()實現程序的同步與互斥。程式中,緩衝池有128個緩衝區,當生產者程序生產了32個產品後,程式停止,按#鍵退出程式,其他任意鍵繼續。程式如下:

#include "stdafx.h"

#include

#include

#include

dword winapi producer(lpvoid lpparam);

dword winapi consumer(lpvoid lpparam);

dword winapi keythread(lpvoid lpparam);

handle full,empty;

handle hmutex;

int buffer[128], bufn=32;

bool producer***=true,consumer***=true;

dword dwthreadid,dwthreadid1,dwthreadid2;

dword dwthrdparam,dwthrdparam1,dwthrdparam2;

handle hthread,hthread1,hthread2;

ulong excode=0;

void main(int argc, char* argv)

while (excode==still_active); //如果還處於執行狀態則繼續

}dword winapi producer(lpvoid lpparam)

releasemutex(hmutex); //訊號量hmutex做signal操作

releasesemaphore(full,1,null); //訊號量full做signal操作

}while(producer***==true);

return 0;

}dword winapi consumer(lpvoid lpparam)

while (consumer***==true);

return 0;

}輸出結果為:

p[0]=41, p[1]=18467, p[2]=6334, p[3]=26500, p[4]=19169, p[5]=15724, p[6]=11478, p[7]=29358, p[8]=26962, p[9]=24464, p[10]=5705, p[11]=28145, p[12]=23281, p[13]=16827, p[14]=9961, p[15]=491, p[16]=2995, p[17]=11942, p[18]=4827, p[19]=5436, p[20]=32391, p[21]=14604, p[22]=3902, p[23]=153, p[24]=292, p[25]=12382, p[26]=17421, p[27]=18716, p[28]=19718, p[29]=19895, p[30]=5447, p[31]=21726,

c[0]=41, c[1]=18467, c[2]=6334, c[3]=26500, c[4]=19169, c[5]=15724, c[6]=11478, c[7]=29358, c[8]=26962, c[9]=24464, c[10]=5705, c[11]=28145, c[12]=23281, c[13]=16827, c[14]=9961, c[15]=491, c[16]=2995, c[17]=11942, c[18]=4827, c[19]=5436, c[20]=32391, c[21]=14604, c[22]=3902, c[23]=153, c[24]=292, c[25]=12382, c[26]=17421, c[27]=18716, c[28]=19718, c[29]=19895, c[30]=5447, c[31]=21726, p[0]=14771, p[1]=11538, p[2]=1869, p[3]=19912, p[4]=25667, p[5]=26299, p[6]=17035, p[7]=9894, p[8]=28703, p[9]=23811, p[10]=31322, p[11]=30333, p[12]=17673, p[13]=4664, p[14]=15141, p[15]=7711, p[16]=28253, p[17]=6868, p[18]=25547, p[19]=27644, p[20]=32662, p[21]=32757, p[22]=20037, p[23]=12859, p[24]=8723, p[25]=9741, p[26]=27529, p[27]=778, p[28]=12316, p[29]=3035, p[30]=22190, p[31]=1842, c[0]=14771, c[1]=11538, c[2]=1869, c[3]=19912, c[4]=25667, c[5]=26299, c[6]=17035, c[7]=9894, c[8]=28703, c[9]=23811, c[10]=31322, c[11]=30333, c[12]=17673, c[13]=4664, c[14]=15141, c[15]=7711, c[16]=28253, c[17]=6868, c[18]=25547, c[19]=27644, c[20]=32662, c[21]=32757, c[22]=20037, c[23]=12859, c[24]=8723, c[25]=9741, c[26]=27529, c[27]=778, c[28]=12316, c[29]=3035, c[30]=22190, #

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者消費者

using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...

生產者消費者

執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...