⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prodconsmodel.cpp

📁 C++解决的一个生产者消费者模型
💻 CPP
字号:
// ProdConsModel.cpp: implementation of the CProdConsModel class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ServerMFC.h"
#include "ProdConsModel.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CProdConsModel::CProdConsModel(int m_iMaxCapacity)
{
	InitializeCriticalSection(&m_critical);

	this->m_hProductEvent = NULL;
	this->m_hConsumerEvent = NULL;
    this->m_hShutdownEvent = NULL;

	this->m_hProductEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	this->m_hConsumerEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	this->m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	ResetEvent(this->m_hProductEvent);
	ResetEvent(this->m_hConsumerEvent);
	ResetEvent(this->m_hShutdownEvent);
    this->m_iMaxCapacity = m_iMaxCapacity;
}

CProdConsModel::~CProdConsModel()
{
	CloseHandle(m_hProductEvent);
	CloseHandle(m_hConsumerEvent);
	CloseHandle(m_hShutdownEvent);

    DeleteCriticalSection(&m_critical);
}

vector<int> CProdConsModel:: pop_back(vector<int> v, int *pitem)
{
    for (int k=0;k<v.size();k++) {
       int *tmp = v.begin()+k;
	   if (*tmp==*pitem) v.erase(tmp);
    }
	return v;
}

//consumer
int CProdConsModel::get()
{
    SetEvent(m_hConsumerEvent);
	while (getClientConnSize()<=0) { //wait
        WaitForSingleObject(m_hProductEvent,INFINITE);
	}
    ResetEvent(m_hConsumerEvent);

	EnterCriticalSection(&m_critical);
	int *pitem =c_vector.begin();
    int var = *pitem;
	c_vector = pop_back(c_vector,pitem);
	LeaveCriticalSection(&m_critical);
	
    return var;
}

//producer
void CProdConsModel::set(int clientSocket)
{
	SetEvent(m_hProductEvent);
	while (getClientConnSize()>m_iMaxCapacity) {
        WaitForSingleObject(m_hConsumerEvent,INFINITE);
	}
    ResetEvent(m_hProductEvent);

	EnterCriticalSection(&m_critical);
    c_vector.push_back(clientSocket);
	LeaveCriticalSection(&m_critical);
}

int CProdConsModel::getClientConnSize()
{
	EnterCriticalSection(&m_critical);
	int size = c_vector.size();
	LeaveCriticalSection(&m_critical);
	return size;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -