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"); }
相关文章推荐
- Linux C/C++多线程学习:生产者消费者问题
- 生产者与消费者以及多个容器的多线程问题(经典 集合了老师,同学以及自己的想法)
- c++多线程 (生产者消费者问题)
- C++多线程学习:生产者消费者问题
- C++ 11新特性之用多线程实现生产者消费者问题
- 多线程多个消费者与生产者(c++版)
- 使用jdk1.5的多线程 lock condition 实现方式实现 生产者消费者问题
- 黑马程序员-多线程(生产者与消费者问题)
- 多线程实现生产者消费者问题 详细注释 事件+临界区 信号量+临界区2种方法
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结
- java 中多线程生产者消费者问题详细介绍
- JAVA学习第二十七课(多线程(六))- 多生产者多消费者问题(JDK1.5新特性)
- 多线程——生产者与消费者(多)1.5新锁,问题解决
- 由生产者/消费者问题看JAVA多线程
- 秒杀多线程第十篇 生产者消费者问题
- 秒杀多线程第十篇 生产者消费者问题
- java多线程 生产者 消费者 问题 。。。
- 秒杀多线程第十篇 生产者消费者问题
- java多线程解决生产者消费者问题
- 由生产者/消费者问题看JAVA多线程