//******************************************************************************//
//* 实验一 生产者消费者问题 *//
//******************************************************************************//
#include <windows.h>
#include <stdio.h>
#include <iostream.h>
const unsigned short SIZE_OF_BUFFER = 10; //缓冲队列长度
unsigned short ProductID = 0;
unsigned short ConsumeID = 0;
unsigned short in = 0;
//相当于缓冲单元指针,生产者进程每次将产品放入该指针指示的缓冲单元,
并将指针后移一个缓冲单元
unsigned short out = 0;
并将指针后移一个缓冲单元
//相当于缓冲单元指针,消费者进程每次从该指针指示的缓冲单元取出产品,
typedef struct BufferType{
int productID;
Buffer g_buffer[SIZE_OF_BUFFER];
//缓冲队列(作为循环队列使用)
//控制程序结束
//线程间互斥的信号量
//线程间同步的信号量
bool g_continue = true;
HANDLE g_hMutex;
HANDLE g_hEmptySemaphore;
HANDLE g_hFullSemaphore;
DWORD WINAPI Producer(LPVOID);
DWORD WINAPI Consumer(LPVOID);
//创建互斥的信号量和同步的信号量
g_hMutex = CreateMutex(NULL,FALSE,NULL);
g_hEmptySemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);
g_hFullSemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);
//调整下面的数值,可以发现,当生产者个数多于消费者个数时,生产速度快,生产者经常等待消费者;
反之,消费者经常等待
const unsigned short PRODUCERS_COUNT = 3; //要创建的生产者线程的个数
const unsigned short CONSUMERS_COUNT = 1; //要创建的消费者线程的个数
//总的线程数
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
HANDLE hProducerThread[PRODUCERS_COUNT];//生产者线程的handle
HANDLE hConsumerThread[CONSUMERS_COUNT];//消费者线程的handle
DWORD producerID[PRODUCERS_COUNT]; //生产者线程ID
DWORD consumerID[CONSUMERS_COUNT]; //消费者线程ID
int i;
for (i=0;i<PRODUCERS_COUNT;++i){
hProducerThread[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
if (hProducerThread[i]==NULL) return -1;
}