盒子
盒子
文章目录
  1. Demo
  2. 简单线程池

多线程

Demo

简单线程池

// .h
#pragma once
/************************************************************************/
/* 简单线程池 */
/************************************************************************/
#include <queue>

typedef void(*PMyThreadPoolCallBack)(LPVOID lpData, LPVOID lpParam);

class CMyThreadPool
{
public:
CMyThreadPool();
~CMyThreadPool();
private:
CriticalSection m_cs;
bool m_bExist;
PMyThreadPoolCallBack m_cb;
LPVOID m_cbParam;
DWORD m_dwQueueMaxSize;
private:
std::queue<LPVOID> m_queue;
std::vector<HANDLE> m_vecHandle;
protected:
static DWORD WINAPI _Run(LPVOID);
void Run();
LPVOID GetPopFont();
public:
void Add(LPVOID pData);
void Start(DWORD dwThreadCount, DWORD queueMaxSize, PMyThreadPoolCallBack cb, LPVOID lpParam);
void WaitStop();
};
// .cpp
#include "stdafx.h"
#include "MyThreadPool.h"

CMyThreadPool::CMyThreadPool()
{
m_bExist = false;
m_cb = NULL;
m_cbParam = NULL;
}

CMyThreadPool::~CMyThreadPool()
{}

void CMyThreadPool::Add(LPVOID pData)
{
// 控制上限
while (m_queue.size() > m_dwQueueMaxSize)
Sleep(1);
CriticalSectionManager csm(m_cs);
m_queue.push(pData);
}

void CMyThreadPool::Start(DWORD dwThreadCount, DWORD queueMaxSize, PMyThreadPoolCallBack cb, LPVOID lpParam)
{
m_cb = cb;
m_cbParam = lpParam;
m_dwQueueMaxSize = queueMaxSize;
for (DWORD index = 0; index < dwThreadCount; index++)
{
HANDLE handle = CreateThread(NULL, 0, _Run, this, 0, NULL);
m_vecHandle.push_back(handle);
}
}
void CMyThreadPool::WaitStop()
{
m_bExist = true;
for (DWORD index = 0; index < m_vecHandle.size(); index++)
{
WaitForSingleObject(m_vecHandle[index], INFINITE);
CloseHandle(m_vecHandle[index]);
}
m_vecHandle.clear();
m_cb = NULL;
m_cbParam = NULL;
}

DWORD WINAPI CMyThreadPool::_Run(LPVOID lpVoid)
{
CMyThreadPool *pThis = (CMyThreadPool*)lpVoid;
pThis->Run();
return 0;
}

LPVOID CMyThreadPool::GetPopFont()
{
CriticalSectionManager csm(m_cs);
if (m_queue.empty())
return NULL;
LPVOID pData = m_queue.front();
m_queue.pop();
return pData;
}

void CMyThreadPool::Run()
{
LPVOID pData = NULL;
while(!m_bExist || !m_queue.empty())
{
if (!m_cb || m_queue.empty())
{
Sleep(1);
continue;
}
pData = GetPopFont();
if(pData == NULL)
continue;
if (m_cb)
m_cb(pData, m_cbParam);
}
}
支持一下
扫一扫,支持一下
  • 微信扫一扫
  • 支付宝扫一扫