每天一算法(三)生产着消费者问题

来源:互联网 发布:厦门seo陈仁潘 编辑:程序博客网 时间:2024/05/16 07:04
// multiThread.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<windows.h>#include<iostream>using namespace std;const unsigned short SIZE_OF_BUFFER=10; //the length of bufferunsigned short buffer[SIZE_OF_BUFFER]={0}; //create space for bufferunsigned short in=0;                   //the mark of position entering the space unsigned short out=0;                  //the mark of position leaving the spaceunsigned short Product_ID=0;           //the ID of product,from 1 to 10,not for countunsigned short Consume_ID=0;           //the ID of consume product_ID in the bufferunsigned int produce_sum=0;            //the total produce numberunsigned int consume_sum=0;            //the total consume numberHANDLE mutex;                          //the mutex between threadsHANDLE Full_Semaphore;                 //the resource semaphore: buffer is fullHANDLE Empty_Semaphore;                //the resource semaphore: buffer is emptyconst unsigned short p_count=20;        //the number of produce one timeconst unsigned short c_count=6;        //the number of consumer one timeconst unsigned short s_count=p_count+c_count;  //the sum number of threadsHANDLE threads[s_count];               //the handle of every threadDWORD Producer_ID[p_count];            //the mark of producer threadDWORD Consumer_ID[c_count];            //the mark of consumer threadunsigned short control=1;              //control the program run or stopDWORD WINAPI producer(LPVOID);         //the producer threadDWORD WINAPI consumer(LPVOID);         //the consumer threadvoid produce();                                            void consume();void Create_P_Threads();               //create producer threadvoid Create_C_Threads();               //create consumer threadvoid Product_Sum();                    //print the total of remain product number and print the buffervoid info();                           //infovoid Product_Sum(){int i,sum=0;for(i=0;i<SIZE_OF_BUFFER;i++){if(buffer[i]!=0)sum++;}std::cout<<"  "<<sum<<"         ";for(i=0;i<SIZE_OF_BUFFER;i++){std::cout<<buffer[i]<<" ";}printf("\n");}void produce(){int i;std::cout<<"produce";if(Product_ID>=10)Product_ID=0;Product_ID++;produce_sum++;buffer[in]=Product_ID;printf(" buffer[%d]=%d    ",in,Product_ID);in=(in+1)%SIZE_OF_BUFFER;Product_Sum();}void consume(){int i;std::cout<<"consume";consume_sum++;Consume_ID=buffer[out];printf(" buffer[%d]=%d    ",out,Consume_ID);buffer[out]=0;out=(out+1)%SIZE_OF_BUFFER;Product_Sum();}DWORD WINAPI producer(LPVOID)                               //producer thread{while(control){WaitForSingleObject(Full_Semaphore,INFINITE);       //resource semaphore P operationWaitForSingleObject(mutex,INFINITE);                //the mutex P operationproduce();Sleep(1000);ReleaseMutex(mutex);                                //resource semaphore P operationReleaseSemaphore(Empty_Semaphore,1,NULL);            //the mutex P operation}return 0;}DWORD WINAPI consumer(LPVOID)                              //consumer thread{while(control){WaitForSingleObject(Empty_Semaphore,INFINITE);WaitForSingleObject(mutex,INFINITE);consume();Sleep(1000);ReleaseMutex(mutex);ReleaseSemaphore(Full_Semaphore,1,NULL);}return 0;}void Create_P_Threads()                                  //create producer thread{for(int i=0;i<p_count;i++){threads[i]=CreateThread(NULL,0,producer,NULL,0,&Producer_ID[i]);if(threads[i]==NULL)control=0;}}void Create_C_Threads(){for(int i=p_count;i<s_count;i++){threads[i]=CreateThread(NULL,0,consumer,NULL,0,&Consumer_ID[i-p_count]);if(threads[i]==NULL)control=0;}}void info(){std::cout<<"\n"<<std::endl;std::cout<<"**********I did refer to the program on the web."<<std::endl; std::cout<<"*******and I simplify some things and make it more powful!"<<std::endl;std::cout<<"**But it is really a word a word knocked out by me based on understanding\n"<<std::endl;std::cout<<"produce/consume    remain_total  buffer_state(from 0 to 9)"<<std::endl;}int main(){info();mutex=CreateMutex(NULL,FALSE,NULL);Full_Semaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);Empty_Semaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);Create_P_Threads();Create_C_Threads();while(control){if(getchar()){std::cout<<std::endl;std::cout<<"the total produce product number is "<<produce_sum<<std::endl;std::cout<<"the total consume product number is "<<consume_sum<<std::endl;control=0;}}return 0;}

0 0
原创粉丝点击