3.3模块说明:
const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度
unsigned short ProductID = 0; //产品号 unsigned short ConsumeID = 0; //将被消耗的产品号
unsigned short in = 0; //产品进缓冲区时的缓冲区下标
unsigned short out = 0; //产品出缓冲区时的
缓冲区下标
int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列 bool g_continue = true; //控制程序结束 HANDLE g_hMutex; //用于线程间的互斥 HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待
HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待
DWORD WINAPI Producer(LPVOID); //生产者线程 DWORD WINAPI Consumer(LPVOID); //消费者线程
3.4源程序
#include
const unsigned short SIZE_OF_BUFFER = 20;//有界缓冲区长度 int g_buffer[SIZE_OF_BUFFER];//开辟缓冲区,用数组表示,可以看成是一个循环队列
unsigned short ProductID = 0;//新生产出来的产品的产品号 unsigned short ConsumeID = 0;//被消耗的产品的产品号
unsigned short in = 0;//产品进缓冲区时的缓冲区下标,用于记录生产者的指针位置
unsigned short out = 0;//产品出缓冲区时的缓冲区下标,用于记录消费者的指针位置
bool g_continue = 1;//控制程序运行:1表示继续运行,0表示停止运行
HANDLE g_hMutex;//线程间的互斥信号量
HANDLE g_hFullSemaphore;//资源信号量:缓冲区满 HANDLE g_hEmptySemaphore;//资源信号量:缓冲区空 DWORD WINAPI Producer(LPVOID);//生产者线程 DWORD WINAPI Consumer(LPVOID);//消费者线程
const unsigned short PRODUCERS_COUNT=4;//生产者的个数 const unsigned short CONSUMERS_COUNT=3;//消费者的个数 const
unsigned
short
THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;//总线程数
HANDLE hThreads[PRODUCERS_COUNT];//各线程的handle DWORD producerID[CONSUMERS_COUNT];//生产者线程的标识符 DWORD consumerID[THREADS_COUNT];//消费者线程的标识符
/*----------------------------------------------------------*/
//生产一个产品,输出其ID号 void Produce() { }
/*----------------------------------------------------------*/
/*----------------------把新生产的产品放入缓冲区开始------------------------*/
//把新生产的产品放入缓冲区 void Append()
生
产
一
个
产
品
结
束
std::cout< std::cerr<<\生产一个产品: \std::cout< 生 产 一 个 产 品 开 始 { std::cerr<<\把生产的产品送入缓冲区\g_buffer[in]=ProductID; in=(in+1)%SIZE_OF_BUFFER; std::cerr< std::cout<<\缓冲区 产品 生产者/消费者\ //新产品放入缓冲区后,输出缓冲区当前的状态 for(int i=0;i //输出缓冲区下标 if (i<10) std::cout< else std::cout< if(i==in) { } if(i==out) { if(g_buffer[i]<10) std::cout<<\if(g_buffer[i]<10) std::cout<<\ else std::cout<<\ std::cout<<\生产者\输出生产者的指针位置 else std::cout<<\ std::cout<<\消费者\输出消费者的指针位置