今天介绍一下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>
本文没有粘贴复制,都是手码的,避免不了有些错误,如果有帮助你的或者有需要的,还请点赞转发收藏,或者私信我。
閱讀更多 小白說編程 的文章