生产者消费者线程

来源:互联网 发布:手机淘宝支付宝在哪里 编辑:程序博客网 时间:2024/05/20 09:26
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<windows.h> using namespace std; typedef int semaphore;/*信号量是一种特殊的整型变量*/ const int SIZE_OF_BUFFER=5;//缓冲区长度 const unsigned short PRODUCERS_COUNT=2;//生产者的个数 const unsigned short CONSUMERS_COUNT=3;//消费者的个数 DWORD producers[PRODUCERS_COUNT];//生产者线程的标识符 DWORD consumers[CONSUMERS_COUNT];//消费者线程的标识符 const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;//总的线程数 /** *定义信号量*/ HANDLE mutex;//互斥信号量 HANDLE full;//表示放有产品的缓冲区数,其初值为0 HANDLE empty;//表示可供使用的缓冲区数,其初值为N /** *定义共享缓冲区*/ semaphore buffer[SIZE_OF_BUFFER];/** *定义生产者和消费者使用的指针*/ int in=0; int out=0; int productNum=0; DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); int main(int argc,char*argv[]) {//创建Mutex和Semaphore 44.mutex=CreateMutex(NULL,FALSE,NULL);full=CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);empty=CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);HANDLE PVThreads[THREADS_COUNT];//各线程的handle //创建生产者线程 for(int i=0;i<PRODUCERS_COUNT;i++){ PVThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producers[i]);if(PVThreads[i]==NULL)break; }//创建消费者线程 for(int i=0;i<CONSUMERS_COUNT;i++){ PVThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumers[i]);if(PVThreads[i]==NULL)break; }bool isContinue=true; while(isContinue) {if(getchar()){//按回车后终止程序运行 isContinue=false; }}system("PAUSE"); return 0; }void enBuffer(int pos) {cout<<"正在生产产品..."<<endl; Sleep(2000);buffer[pos]=-1;productNum++;cout<<"生产完成!已生产"<<productNum<<"个产品,并将新产品放在了缓冲区位置:"<<pos<<endl; }void deBuffer(int pos) {cout<<"正在消费产品..."<<endl; Sleep(1000);buffer[pos]=-2;productNum--;cout<<"已消费在缓冲区位置:"<<pos<<"的产品,缓冲区剩余空间:"<<SIZE_OF_BUFFER-productNum<<endl; cout<<endl;}/** *生产者*/ DWORD WINAPI Producer(LPVOID lpParam) {while(1) {WaitForSingleObject(empty,INFINITE);//P(empty)生产者信号量-1 WaitForSingleObject(mutex,INFINITE);//P(mutex)获取线程间互斥信号 enBuffer(in);Sleep(1000);in=(in+1)%SIZE_OF_BUFFER;ReleaseMutex(mutex);//V(mutex)释放线程间互斥信号 ReleaseSemaphore(full,1,NULL);//V(full)消费者信号量+1}return 0; }/** *消费者*/ DWORD WINAPI Consumer(LPVOID lpPara) {while(1) {WaitForSingleObject(full,INFINITE);//P(full)消费者信号量-1 WaitForSingleObject(mutex,INFINITE);//P(mutex)获得线程间互斥信号 deBuffer(out);Sleep(1000);out=(out+1)%SIZE_OF_BUFFER;ReleaseMutex(mutex);//V(mutex)释放线程间互斥信号 ReleaseSemaphore(empty,1,NULL);//V(empty)生产者信号量+1 126.127.}return 0; }

0 0