生产者消费者问题: 该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。具体我就不解释了 应该都懂 不懂请百度一下
我是用事件实现生产者消费者问题的同步 用临界区实现互斥 我的这个做法与经典做法不同 即用信号量的做法! 经典做法为法二
法一:
具体看代码:
#include <stdio.h>
#include <Windows.h>
#include <process.h>
int vol = 2;//缓冲区容量
int *g_pBuffer, g_BufferOff = 0, count;//依次为缓冲区,指向当前产品存放的位置, 目前缓冲区中产品数量
HANDLE g_ProducerEvent, g_ConsumerEvent;
CRITICAL_SECTION g_cs;//临界区
int ProNum = 10;//要生产的产品数量
int HasProduced = 0;//已经生产的个数
int HasConsumerd = 0;//已经消费的个数
unsigned int __stdcall FunPro(PVOID Pv)//生产者
{
int k = *(int *)Pv;//生产者编号
while(1)
{
WaitForSingleObject(g_ProducerEvent, INFINITE);//等待生产者获取运行权限
EnterCriticalSection(&g_cs);//申请临界区
if(count < vol)//缓冲区未满
{
if(count == 0)//如果当前有0个产品
{
SetEvent(g_ProducerEvent);//让生产者运行
ResetEvent(g_ConsumerEvent);//阻止消费者运行
}
else
{
SetEvent(g_ProducerEvent);//如果有多个产品 且缓冲区没满
SetEvent(g_ConsumerEvent); //让2者均可以运行
}