CPP线程管理类实现

server/2024/11/17 4:54:34/

 一个线程管理模块应该包含Task(任务类)、Thread(线程类)、线程管理类(ThreadManager)。

#pragma once
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <queue>
#include <functional>
#include <condition_variable>typedef std::function<void(void*)> ThreadTaskFun;// 任务类
class Task {
public:Task(ThreadTaskFun, void* param = nullptr) : func_(std::move(func)), taskParams(param){}Task() {}void execute() {if (func_) {func_(taskParams);}}private:std::function<void(void*)> func_;void* taskParams;
};// 线程类
class Thread {
public:Thread() : thread_(), active_(false) {}void start() {active_ = true;thread_ = std::thread([this]() {while (active_) {Task task;{std::unique_lock<std::mutex> lock(mutex_);// 等待任务队列不为空condition_.wait(lock, [this]() { return !tasks_.empty() || !active_; });if (!active_) {break;}task = std::move(tasks_.front());tasks_.pop();}task.execute();}});}void stop() {if (active_) {active_ = false;condition_.notify_one();if (thread_.joinable()) {thread_.join();}}}void addTask(Task task) {std::lock_guard<std::mutex> lock(mutex_);tasks_.push(std::move(task));condition_.notify_one();}private:std::thread thread_;std::queue<Task> tasks_;std::mutex mutex_;std::condition_variable condition_;bool active_;
};// 线程管理类
class ThreadManager {
public:ThreadManager(int num_threads) {for (int i = 0; i < num_threads; ++i) {threads_.emplace_back(std::make_unique<Thread>());}}~ThreadManager(){stopThreads();}void startThreads() {for (auto& thread : threads_) {thread->start();}}void stopThreads() {for (auto& thread : threads_) {thread->stop();}}void addTask(Task task) {if (index_ >= threads_.size()) {index_ = 0; // 循环使用线程}threads_[index_]->addTask(std::move(task));index_++;}private:std::vector<std::unique_ptr<Thread>> threads_;int index_ = 0;
};

Demo

#include "threadpool.h"class Resources
{
public:Resources(){resourcesThreadFun = std::bind(&Resources::exampleTaskFunction, this, std::placeholders::_1);}void exampleTaskFunction(void* param) {int index = 0;std::cout << "Executing task " << index << " in thread: " << std::this_thread::get_id() << std::endl;}ThreadTaskFun resourcesThreadFun;};int main() {ThreadManager manager(4); // 创建4个线程manager.startThreads();Resources* pResource = new Resources();// 添加10个示例任务for (int i = 0; i < 100; ++i) {Task task(pResource->resourcesThreadFun);manager.addTask(std::move(task));}std::cout << "main thread over!" << std::endl;return 0;
}


http://www.ppmy.cn/server/22995.html

相关文章

Java 设计模式(行为型)

文章目录 策略模式迭代器模式访问者模式观察者模式命令模式模板方法模式事件驱动模式责任链模式中介者模式状态模式 策略模式 策略模式是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装在独立的策略类中&#xff0c;并使它们可以互相替换。策略模…

信息系统管理

目录 一、信息系统管理范围 1、规划和组织 2、设计和实施 ①、信息系统架构 Ⅰ、集中式架构 Ⅱ、分布式架构 Ⅲ、SOA&#xff08;面向服务的系统架构&#xff09; 3、运维和服务 ①、运行管理和控制 ②、IT服务管理 ③、运行与监控 Ⅰ、运行监控 Ⅱ、安全监控 4、…

vite-electron 静默打印功能实现

系列文章目录 electronvitevue3 快速入门教程 文章目录 系列文章目录前言一、实现方案二、< webview />讲解1、属性2、 监听事件3、方法 三、 webview与渲染进程通信1.渲染进程--->webview2.webview--->渲染进程&#xff1a; 四、代码实战打印样式说明踩坑说明 前…

算法课程笔记——如何倍增

快速幂 读入量大于1e5不要用cin读入&#xff0c;要用也要关闭同步流 第i个o次方的父亲 #include<bits/stdc.h>usingnamespacestd; #definemaxn 110000#definell long longintn, a[maxn], f[maxn][40]; intquery(intl, intr){intk (int)(log((r - l 1) * 1.0) / log(2.0…

数据结构与算法-迭代加深搜索算法

迭代加深搜索&#xff08;Iterative Deepening Search&#xff0c;IDS&#xff09; 是一种常用的搜索算法&#xff0c;结合了深度优先搜索的空间效率和广度优先搜索的完备性和最优性。其核心思想是重复进行深度优先搜索&#xff0c;但每次都增加搜索的深度限制&#xff0c;直到…

VR全景创业项目应该如何开展?未来有市场吗?

伴随着5G网络的发展&#xff0c;VR全景得到了众多的关注和提升。与此同时&#xff0c;各行各业都开始关注自身产业在互联网的展示效果&#xff0c;因为年轻一代的生活已经离不开互联网&#xff0c;而VR全景在互联网上的3D展示效果能给商家带来流量&#xff0c;提升营业额。 随着…

使用Docker搭建Nacos集群

本次是在Mac的M1版本上使用Docker搭建Nacos集群的详细步骤&#xff0c;并记录了一些遇到的问题及解决方案。 搭建涉及&#xff1a;1个Nginx 3个Nacos 1个MySQL 使用版本&#xff1a;Nginx为1.22.0&#xff0c;Nacos为2.0.3&#xff0c;MySQL为8.0.30 一、创建虚拟网络 因为M…

数据结构 第六章 树与二叉树(三)

&#x1f680; 【考纲要求】二叉树的遍历 &#x1f680; 第六章第一节内容请查看此链接 树的基本概念 &#x1f680; 第六章第二节内容请查看此链接 二叉树的定义、四种特殊的二叉树和二叉树的存储结构 三、二叉树的遍历和线索二叉树 3.1二叉树的遍历 所谓的二叉树的遍历就是…