L o a d i n g . . .
主打一个C++
文章详情

C++跨平台线程池类

Posted on 2021-08-03 10:23:49 by 主打一个C++

C++11+的一个跨平台的线程池封装类

#include <iostream>
#include <mutex>
#include <vector>
#include <functional>
#include <queue>
//类体
class CThreadPool {
public:
	CThreadPool() : m_stop(false), m_executionCount(0) {}
	~CThreadPool() {
		if (m_stop == false) {
			{
				std::unique_lock<std::mutex> lock(m_queueMutex);
				m_stop = true;
			}
			//通知所有线程做完任务
			m_condition.notify_all();
			//等待所有任务执行完成
			for (std::thread& worker : m_workers) {
				worker.join();
			}
			//printf("%s\n", __FUNCTION__);
		}
	}
	void Start(int numThreads) {
		for (int i = 0; i < numThreads; ++i) {
			this->AddThread();
		}
	}
private:
    //增加线程
	void AddThread(bool _loop = true/*是否循环利用线程*/) {
		m_workers.emplace_back([this, _loop] {
			do
			{
				std::function<void()> task;
				{
				    //序列锁
					std::unique_lock<std::mutex> lock(this->m_queueMutex);
					this->m_condition.wait(lock, [this] { return this->m_stop || !this->m_tasks.empty(); });
					if (this->m_stop && this->m_tasks.empty()) {
						//没有任何任务了直接结束
						return;
					}
					//取任务
					task = std::move(this->m_tasks.front());
					//弹出
					this->m_tasks.pop();
				}
				//执行
				m_executionCount++;
				task();
				{
					std::unique_lock<std::mutex> lock(this->m_executionCountMutex);
					m_executionCount--;
				}
			} while (_loop);
			}
		);
	}
public:
    //增加任务
	template<class F, class... Args>
	void AddTask(F&& f, Args&&... args) {
		{
			std::unique_lock<std::mutex> lock(m_queueMutex);
			m_tasks.emplace(std::bind(std::forward<F>(f), std::forward<Args>(args)...));
		}
		m_condition.notify_one();
	}
	//自生自灭式启动线程
	template<class F, class... Args>
	void AddTaskAuto(F&& f, Args&&... args) {
		this->AddTask(f, args...);
		this->AddThread(false);
	}
	//任务线程总数
	int GetWorkeThreadCount() {
		int count = 0;
		{
			std::unique_lock<std::mutex> lock(this->m_queueMutex);
			count = (int)m_workers.size();
		}
		return count;
	}
	//待执行的任务数量
	int GetTaskCount() {
		int count = 0;
		{
			std::unique_lock<std::mutex> lock(this->m_queueMutex);
			count = (int)m_tasks.size();
		}
		return count;
	}
	//执行中的任务数量
	int GetExecutionCount() {
		int count = 0;
		{
			std::unique_lock<std::mutex> lock(this->m_queueMutex);
			count = (int)m_executionCount;
		}
		return count;
	}
	//执行和待执行
	int GetTaskAllCount() {
		int count = 0;
		{
			std::unique_lock<std::mutex> lock(this->m_queueMutex);
			count = m_executionCount + (int)m_tasks.size();
		}
		return count;
	}
	//等待所有任务结束
	int WaitForTask(int _timeOut = -1) {
		while (m_executionCount > 0) {
			//printf("%d\n", m_executionCount);
			std::this_thread::sleep_for(std::chrono::microseconds(10));
		}
		return m_executionCount;
	}
private:
	std::vector<std::thread> m_workers;			//线程数组
	std::queue<std::function<void()>> m_tasks;	//任务队列
	std::mutex m_queueMutex;					//互斥锁
	std::condition_variable m_condition;		//条件变量
	bool m_stop;								//结束标志
	std::mutex m_executionCountMutex;			//任务总数量互斥锁
	int m_executionCount;						//待执行和执行中的任务总数量
};

//调用例子:

//声明一个类,论场景使用,可直接设置静态类
CThreadPool g_threadPool;
//任务函数
void thread(int _a){
    //打印参数值
    printf("%d\n",a);
}

//1.固定线程型,一次启动十个异步线程
int main() {
    //初始化工作线程
	g_threadPool.Start(10);
	//启动
	for (int i = 0; i < 10; i++) {
		g_threadPool.AddTask(&thread, i);
	}

	return 0;
}

//2.自动管理型
int main() {
    //直接启动
	for (int i = 0; i < 10; i++) {
		g_threadPool.AddTaskAuto(thread, i);
	}

	return 0;
}


*转载请注明出处:原文链接:https://cpp.vin/page/7.html

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.02s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog