C++进阶—>互斥量:Event控制:多线程实现生产者-消费者例子
来源:互联网 发布:mac usb接口没反应 编辑:程序博客网 时间:2024/06/06 18:43
一个典型的生产者-消费者问题,它们公用的资源是SharedBuffer,当Buffer中有数据且未满时,两个线程都可以运行,当Buffer为 空时,Consumer就要等待,直到Buffer不为空,这里就是用event来实现的;同样,当Buffer为满时,Producer就要等待。
开发环境:VS2012,win32控制台程序
#include "stdafx.h"#include <iostream>#include <windows.h>using namespace std;#define BUFSIZE 5int SharedBuffer[BUFSIZE];int head,tail;int cont;HANDLE hMutex;HANDLE hNotFullEvent, hNotEmptyEvent;void BB_Producer(){int i;for (i=20; i>=0; i--) {while(1) {WaitForSingleObject(hMutex,INFINITE);if (cont == BUFSIZE) { // 缓冲区满ReleaseMutex(hMutex);// 等待直到缓冲区非满WaitForSingleObject(hNotFullEvent,INFINITE);continue;}// 得到互斥锁且缓冲区非满,跳出while循环break;}// 得到互斥锁且缓冲区非满,开始产生新数据cout << "Produce: " << i << endl;SharedBuffer[tail] = i;tail = (tail+1) % BUFSIZE;cont++;ReleaseMutex(hMutex); // 结束临界区PulseEvent(hNotEmptyEvent); // 唤醒消费者线程}}void BB_Consumer(){int result;while (1) {WaitForSingleObject(hMutex,INFINITE);if (cont == 0) { // 没有可以处理的数据ReleaseMutex(hMutex); // 释放互斥锁且等待// 等待直到缓冲区非空WaitForSingleObject(hNotEmptyEvent,INFINITE);}else if (SharedBuffer[head] == 0) {cout << "Consumed 0: end of data" << endl;ReleaseMutex(hMutex); // 结束临界区ExitThread(0);}else { // 获得互斥锁且缓冲区有数据,开始处理result = SharedBuffer[head];cout << "Consumed: " << result << endl;head = (head+1) % BUFSIZE;cont--;ReleaseMutex(hMutex); // 结束临界区PulseEvent(hNotFullEvent); // 唤醒生产者线程}}}int main(){HANDLE hThreadVector[2];DWORD ThreadID;cont = 0;head = 0;tail = 0;hMutex = CreateMutex(NULL,FALSE,NULL);hNotFullEvent = CreateEvent(NULL,TRUE,FALSE,NULL);hNotEmptyEvent = CreateEvent(NULL,TRUE,FALSE,NULL);hThreadVector[0] = CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) BB_Producer,NULL, 0, (LPDWORD)&ThreadID);hThreadVector[1] = CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) BB_Consumer,NULL, 0, (LPDWORD)&ThreadID);WaitForMultipleObjects(2,hThreadVector,TRUE,INFINITE);system("pause");return 0;}
阅读全文
0 0
- C++进阶—>互斥量:Event控制:多线程实现生产者-消费者例子
- 多线程实现消费者生产者的例子
- 多线程实现消费者生产者的例子
- 生产者-消费者多线程实现
- 多线程实现生产者消费者
- 多线程实现生产者消费者
- 多线程实现生产者消费者
- 多线程--生产者消费者--简单例子
- 多线程生产者和消费者例子
- <JAVA>多线程-生产者消费者例子
- JAVA多线程实现生产者——消费者
- Java——生产者消费者多线程实现
- 生产者消费者---C实现
- 多线程应用例子2—消费者,生产者,多个缓冲区
- c++多线程实现生产者消费者
- 生产者消费者Java多线程实现
- Java多线程实现,生产者消费者
- 生产者消费者问题 伪代码和C语言多线程实现
- 解决Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!
- 监控中心方案设计
- python __slot__
- P
- Spark SQL 个人总结
- C++进阶—>互斥量:Event控制:多线程实现生产者-消费者例子
- new string("xiaolixi")的参数问题
- 线性表10个问答
- JDBC笔记—对数据库进行增删查改
- collection类的工具类,collections,二分查找,折半查找,collections的常用方法,MAP的使用,
- 在Eclipse添加Android兼容包( v4、v7 appcompat )
- 欢迎使用CSDN-markdown编辑器
- vector中的capacity、size的区别
- (原创)Cassandra数据库的优化总结