生产者消费者思路:
首先定义一个缓冲区Buffer,当Buffer的大小小于BUFFERSIZE,则让生产者一直往里填充数据,满了后则让消费者开始往外拿数据,这里我们可以利用多线程中的Semaphore信号量同步机制,生产者初始化地最多的线程数为4个,这样当调用Waitforsingleproject(g_empty,INIFINITE);这样当我们每次调用一次这个函数,g_empty的引用计数就减一,一直减到0停止,当使用Releasesemaphore(g_empty,1,NULL);时,g_empty的引用计数则加一,这样后面排队的g_empty的线程就又会进去一个;同样的道理,对于消费者,刚开始初始化最多的线程为0个,当生产者放进去一个数后,才调用Releasesemaphore(g_full,1,NULL),使得消费者的引用计数加一,这样就可以就可以调用消费者的线程了;下面直接贴出代码,已经在VS2012下测试通过;
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
const int BUFFERSIZE = 5;
const int PRODUCERNUMBER = 5;
const int CONSUMERNUMBER = 5;
const DWORD timeout = INFINITE;
static int pID = 0;
int cID = 0;
int Buffer[BUFFERSIZE];
HANDLE g_empty;
HANDLE g_full;
HANDLE mutex;
HANDLE pThread[PRODUCERNUMBER];
HANDLE cThread[CONSUMERNUMBER];
DWORD PRODUCERID[PRODUCERNUMBER];
DWORD CONSUMER[CONSUMERNUMBER];
DWORD WINAPI FunPro(LPVOID lpParamer);
DWORD WINAPI FunCon(LPVOID lpPara