您的位置:首页 > 编程语言 > C语言/C++

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

2015-04-20 09:35 288 查看
#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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息