阅读背景:

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

来源:互联网 
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <string>
#include <time.h>
#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 << "生产了一个产品!"<<endl;
				}
				else
				{
					isDone = true;
					ReleaseMutex(mutex);
					ReleaseSemaphore(full, 1, NULL);
					break;
				}
			ReleaseMutex(mutex);
		ReleaseSemaphore(full, 1, NULL);

		Sleep(rand() % pwait + 100); //等待一会
	}
	WaitForSingleObject(disp, INFINITE);
		cout << "生产者" << id << "生产完毕!" << endl;
	ReleaseMutex(disp);
	return 0;
}

//消费者函数
DWORD WINAPI Consumer(LPVOID param)
{
	int id;
	srand(time(NULL));
	for (int i = 0; i < consumeNum; i++)
	{
		if (consumeID[i] == GetCurrentThreadId())
			id = i;
	}

	WaitForSingleObject(disp, INFINITE);
		cout << "消费者"<<id<<"开始工作!" << endl;
	ReleaseMutex(disp);

	while (1)
	{
		WaitForSingleObject(full, INFINITE); //请求一个满缓冲区,阻塞
			WaitForSingleObject(mutex, INFINITE); //请求互斥锁,阻塞
				if (currentLimit < limit)
				{
					currentLimit++;
					consumeCount[id]++;
					cout << "消费者" << id << "消费了一个产品!" << endl;
				}
				else
				{
					isDone = true;
					ReleaseMutex(mutex);
					ReleaseSemaphore(empty, 1, NULL);
					break;
				}
			ReleaseMutex(mutex);
		ReleaseSemaphore(empty, 1, NULL);
		
		Sleep(rand() % cwait + 100); 
	}
	WaitForSingleObject(disp, INFINITE);
		cout << "消费者"<<id<<"消费完毕!" << endl;
	ReleaseMutex(disp);
	return 0;
}

//数据录入函数
void inputNumber()
{
	cout << "请输入生产品总数:";
	cin >> 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");
}#include <iostream>
#include <cstdlib>
#include



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: