生产者消费者 C++

本文介绍了如何使用C++实现生产者消费者模型,通过Semaphore信号量进行线程同步。生产者在Buffer未满时填充数据,消费者在Buffer非空时取出数据。代码已在VS2012环境下测试通过。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产者消费者思路:

首先定义一个缓冲区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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值