C++11线程池。这是我见过最短的线程池代码!

今天介绍一下C++11 里有关线程以及线程池的创建和使用。

在没有C++11 之前,线程池的编写,都比较臃肿。该篇文章用到C++11的新特性,代码更加简洁和方便,也更加安全。

话不多说 直接看代码:

ThreadPool.h

<code>#pragma once

// 处理类
class CTask
{
//....
}

class CThreadPool
{
public:
\t\tCThreadPool() = default;
\t\t\tCThreadPool(int iThreadSize);
~CThreadPool();

\t\t CThreadPool(CThreadPool&)= delete;
CThreadPool operator=(const CThreadPool&) = delete;

void CreateThread();
\t\t\tstatic void ThreadWork(PVOID lpParam);
\t\t\tvoid HandleTask(CTask* p);
\t\t\tvoid AddTask(CTask* p);
\t\t\tint GetThreadCount() { return m_threads.size()}
\t\t\tvoid SetThreadCount(int iCount);
\t\t\tint GetIdleThreadCount(){ return m_iIdleCount}

\t\t\tvoid StopThreadPool() {m_bStop.stor(true)}
}

private:
\t\t\tint m_iThreadCount;
\t\t\tint m_iIdleCount = 0;
\t\t\tstd::vector<:thread> m_threads;\t\t// 线程集合
\t\t\tstd::atomic_bool\t\t\tm_bStop = false;// 设置变量为原子性
\t\t\tstd::condition_variable m_vc;\t\t\t\t\t\t// 条件阻塞
\t\t\tstd::queew<ctask> m_quTask;\t\t\t\t// 任务队列

/<ctask>/<code>

ThreadPool.cpp

<code>#include <mutex>
#include <queue>
#include <atomic>
#include <vector>
#include <thread>
#include <condition>
#include <functional>

#include "ThreadPool.h"

using namespace std:

// 创建线程
CThreadPool::CThreadPool( int iThreadSize)
{
\tm_iIdleCount = iThreadSize;
\tfor( int i=0; i<ithreadsize> {
\t\tCreatThread();
}
}

// 关闭线程池
CThreadPool::~CThreadPool()
{
m_bStop.stor(true);\t // 原子变量操作
m_cv.notify_all();\t\t\t// 条件变量

// 关闭线程。
for( auto& it : m_threads)
{
if(it.joinable)
{
\t\tit.join();
}
}
}

void CThreadPool :: CreateThread()
{
\t\t\tm_thread.emplace_back(&CThreadPool::ThreadWork, this);\t// C++11 新用法
}

// 线程池运转

void CThreadPool::ThreadWork(PVOID lpParam)
{
\tCThreadPool* pPool = (CThreadPool*)lpParam;
\tif(pPool == NULL) return;

\tCTask* pTask = NULL:\t\t// 要取出来并执行的任务
while((pPool->m_bStop).load() != true)
{
\t\t// 上锁取任务
\tstd::unique_lock<:mutex> unLock(pPool->m_mtLock);
\tpPool->m_cv.wait(unLock,
[pPool]{
return (pPool->m_bStop).load() || !pPool->m_quTask.empty();}
\t\t\t\t\t\t\t);
\t\t\t
\t\t\tif(pPool->m_bStop).load() && pPool->m_quTask.empty())
return;

\t\t\tpTask = pPool->m_quTask.front();
\t\t\tpPool->m_quTask.pop();
}

\t\tpPool->m_iIdleCount--;
\t\tpPool->HandleTask(pTask);
\t\tpPool->m_iIdleCount++;
}

void CThreadPool::SetThreadCount(int iCount)
{
\tif( iCount > m_threads.size())
{
\t\tfor(int i =0; i< m_thread.size() - iCount;i++)
{
\t\tCreateThread();
}
}
}

void CThreadPool::HandleTask(CTask* p)
{

\tif(p == NULL) return;

// 执行分发操作。
std::cout << "handle Task:"<<:this_thread::get_id> // .....
}


// 线程池的数据入口
void CThreadPool::AddTask(CTask* p)
{
\tif(p == NULL)
return ;
std::lock_guard<:mutex> mtLock(this->m_mtLock);
m_quTask.push(p);

this->m_cv.notify_one(); // 唤醒一个线程
}/<ithreadsize>/<functional>/<condition>/<thread>/<vector>/<atomic>/<queue>/<mutex>/<code>

本文没有粘贴复制,都是手码的,避免不了有些错误,如果有帮助你的或者有需要的,还请点赞转发收藏,或者私信我。

C++11线程池。这是我见过最短的线程池代码!


分享到:


相關文章: