C++之多个生产者与多个消费者的多线程问题

#include 
#include 
#include 
#include 
#include 
#define MAX_SIZE 100

using namespace std;

//生产完成标准
bool isDone = false;
//基础休息时间
const int pwait = 100;
const int cwait = 200;
//生产总数,生产者数量,消费者数量,缓冲区最大值
int limit, producerNum, consumeNum, maxsize;
//当前生产数量
int currentLimit = 0;
//生产数量统计数组
int producerCount[MAX_SIZE] = { 0 };
//生产ID统计数组
int producerID[MAX_SIZE] = { 0 };
//生产数量统计数组
int consumeCount[MAX_SIZE] = { 0 };
//生产ID统计数组
int consumeID[MAX_SIZE] = { 0 };
//互斥信号量,缓冲区满信号量,缓冲区空信号量,打印信号量
HANDLE mutex, full, empty,disp;


//生产者函数
DWORD WINAPI Producer(LPVOID param)
{
	int id;					//记录生产者编号
	//遍历获取生产者编号
	for (int i = 0; i < producerNum; i++)
	{
		if (producerID[i] == GetCurrentThreadId())
			id = i;
	}
	//输出互斥
	WaitForSingleObject(disp, INFINITE);
		cout << "生产者"<< id <<"开始工作!" << endl;
	ReleaseMutex(disp);
	while (1)
	{
		WaitForSingleObject(empty, INFINITE); //请求一个空缓冲区,阻塞
			WaitForSingleObject(mutex, INFINITE); //请求互斥锁,阻塞
				if (!isDone&¤tLimit < limit)
				{
					producerCount[id]++;
					cout << "生产者" << id << "生产了一个产品!"<> limit;
	cout << "请输入生产者总数:";
	cin >> producerNum;
	cout << "请输入消费者总数:";
	cin >> consumeNum;
	cout << "请输入缓冲区大小:";
	cin >> maxsize;
}
//结果输出函数

void outputResult()
{
	for (int i = 0; i < producerNum; i++)
		cout << i << "号生产者的生产数量为" << producerCount[i] << "个.\n";
	for (int i = 0; i < consumeNum; i++)
		cout << i << "号消费者的消费数量为" << consumeCount[i] << "个.\n";
}

int main()
{
	//参数的输入
	inputNumber();
	//生产者线程与消费者ID
	DWORD *ProducerID=new DWORD[producerNum];
	DWORD *ConsumerID=new DWORD[consumeNum];
	//创建生产者与消费者句柄
	HANDLE *ProducerHandle=new HANDLE[producerNum];
	HANDLE *ConsumerHandle=new HANDLE[consumeNum];
	
	//创建生产者与消费者线程
	for (int i = 0; i < producerNum; i++)
	{
		ProducerHandle[i] = CreateThread(NULL, 0, Producer, NULL, 0, &ProducerID[i]);
		producerID[i] = ProducerID[i];
	}
	for (int i = 0; i < consumeNum; i++)
	{
		ConsumerHandle[i] = CreateThread(NULL, 0, Consumer, NULL, 0, &ConsumerID[i]);
		consumeID[i] = ConsumerID[i];
	}

	//信号量的创建
	disp = CreateMutex(NULL, FALSE, NULL);
	mutex = CreateMutex(NULL, FALSE, NULL);
	full = CreateSemaphore(NULL, 0, maxsize, "full");
	empty = CreateSemaphore(NULL, maxsize, maxsize, "empty");

	for (int i = 0; i < producerNum;i++)
		WaitForSingleObject(ProducerHandle[i], INFINITE);
	for (int i = 0; i < consumeNum; i++)
		WaitForSingleObject(ConsumerHandle[i], INFINITE);
	
	//结果的输出
	outputResult();
	system("pause");
}

你可能感兴趣的:(C++)