生产者消费者线程




#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; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值