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;}


原创粉丝点击