消费者与生产者问题

来源:互联网 发布:网络视听节目审核通则 编辑:程序博客网 时间:2024/05/03 09:26

#include<windows.h>
#include<iostream>

const unsigned short SIZE_OF_BUFFER=4;
unsigned short ProductID=0;
unsigned short ConsumeID=0;
unsigned short in=0;
unsigned short out=0;

int buffer[SIZE_OF_BUFFER];
bool p_ccontinue=true;
HANDLE Mutex;
HANDLE FullSemaphore;
HANDLE EmptySemaphore;

DWORD WINAPI Producer(LPVOID);
DWORD WINAPI Consumer(LPVOID);

int main()
{
Mutex=CreateMutex(NULL,FALSE,NULL);
EmptySemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);

FullSemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);
const unsigned short PRODUCERS_COUNT=3;
const unsigned short CONSUMERS_COUNT=1;

const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;

HANDLE hThreads[THREADS_COUNT];
DWORD producerID[PRODUCERS_COUNT];
DWORD consumerID[CONSUMERS_COUNT];

for(int i=0;i<PRODUCERS_COUNT;++i){
hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
if(hThreads[i]==NULL) return -1;


for(i=0;i<CONSUMERS_COUNT;++i){
hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);
if(hThreads[i]==NULL) return -1;
}

while(p_ccontinue){
if(getchar()){
p_ccontinue=false;
}
}
return 0;
}

void Produce()
{
    std::cout<<std::endl<<"Producing"<<++ProductID<<"...";
std::cout<<"Succeed"<<std::endl;
}

void Append()
{
std::cerr<<"Appending a product ...";
buffer[in]=1;
in=(in+1)%SIZE_OF_BUFFER;
std::cerr<<"Succeed"<<std::endl;

for(int i=0;i<SIZE_OF_BUFFER;++i){
std::cout<<i<<": "<<buffer[i];
if(i==in) std::cout<<" <--生产";
if(i==out) std::cout<<" <--消费";
std::cout<<std::endl;
}
}

void Take()
{
std::cerr<<"Taking a product ...";
//ConsumeID=buffer[out];
buffer[out]=0;
out=(out+1)%SIZE_OF_BUFFER;
std::cerr<<"Succeed"<<std::endl;

for(int i=0;i<SIZE_OF_BUFFER;++i)
{
std::cout<<i<<": "<<buffer[i];
if(i==in) std::cout<<" <--生产";
if(i==out) std::cout<<" <--消费";
std::cout<<std::endl;
}
}

void Consume()
{
 std::cout<<std::endl<<"Consuming "<<++ConsumeID<<"...";
std::cout<<"Succeed"<<std::endl;
}

DWORD WINAPI Producer(LPVOID lpPara)
{
while(p_ccontinue){
WaitForSingleObject(EmptySemaphore,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
Produce();
Append();
Sleep(1500);
ReleaseMutex(Mutex);
ReleaseSemaphore(FullSemaphore,1,NULL);
}
return 0;
}

DWORD WINAPI Consumer(LPVOID lpPara)
{
while(p_ccontinue){
WaitForSingleObject(FullSemaphore,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
Take();
Consume();
Sleep(1500);
ReleaseMutex(Mutex);
ReleaseSemaphore(EmptySemaphore,1,NULL);
}
return 0;
}

0 0
原创粉丝点击