C++ 封装线程池(结合QT支持信号机制)
纯C++风格线程池
纯C++ 风格线程池可参考这篇文章
https://llfc.club/category?catid=225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2c2IJUcCUOfzEQQRRdOXYIZuCjP
视频教程
相关线程池和并发编程的视频可以看看这个连接:
https://www.bilibili.com/video/BV1Xt421H7M7/?vd_source=8be9e83424c2ed2c9b2a3ed1d01385e9
支持信号机制的线程池
我的项目中期待封装一个类,内部有个线程池处理外部投递的内容,这个类同时支持对外发送信号等,同时这个类是一个单例类,那么这个类可以继承QOjbject支持信号机制,并且其内部可以封装一个线程池响应外部投递的任务,结合纯C++版本封装了如下在QT环境使用的线程池,目前已经投入到生产中。
用到的头文件
#include <QObject>
#include <queue>
#include <vector>
#include <thread>
#include <queue>
#include <memory>
#include <functional>
#include <mutex>
#include <atomic>
#include <future>
头文件编写
#ifndef SEQSCHEDULER_H
#define SEQSCHEDULER_H
//wwc 处理维护,关机流程,清洗等时序执行的类
class SeqScheduler: public QObject
{Q_OBJECT
public:~ SeqScheduler();static SeqScheduler& Inst();template<typename F, typename ... Args>auto CommitTask(F&& func, Args && ... args) ->std::future<decltype(std::forward<F>(func)(std::forward<Args>(args)...))> {using RetType = decltype(std::forward<F>(func)(std::forward<Args>(args)...));if (_b_stop.load()) {return std::future<RetType>{};}auto bind_func = std::bind(std::forward<F>(func), std::forward<Args>(args)...);auto pack_task = std::make_shared<std::packaged_task<RetType(void)>>(bind_func);auto future = pack_task->get_future();{std::lock_guard<std::mutex> lock(_work_mtx);_work_que.push([pack_task]() {(*pack_task)();});}_work_con.notify_one();return future;}private: SeqScheduler(const SeqScheduler&) = delete;SeqScheduler& operator = (const SeqScheduler&) = delete;SeqScheduler(unsigned int num = std::thread::hardware_concurrency());std::queue<std::function<void(void)>> _work_que;std::mutex _work_mtx;std::condition_variable _work_con;std::atomic<bool> _b_stop;std::vector<std::thread> _pool;std::atomic_int _thread_num;
};#endif // SEQSCHEDULER_H
类的具体实现
#include "seqscheduler.h"SeqScheduler::SeqScheduler(unsigned int num ): _b_stop(false)
{if (num <= 1)_thread_num = 1;else_thread_num = num;for (int i = 0; i < _thread_num; i++) {_pool.emplace_back([this]() {for (; !(_b_stop.load());) {std::unique_lock<std::mutex> unique_locker(_work_mtx);_work_con.wait(unique_locker, [this]() {if (_b_stop.load()) {return true;}if (_work_que.empty()) {return false;}return true;});if (_b_stop.load()) {return;}//出队auto task = _work_que.front();_work_que.pop();unique_locker.unlock();task();}});}}SeqScheduler& SeqScheduler::Inst()
{static SeqScheduler inst;return inst;
}SeqScheduler::~SeqScheduler(){_b_stop = true;{std::unique_lock<std::mutex> unique_locker(_work_mtx);_work_con.notify_all();}for (auto& td : _pool) {if (td.joinable()) {std::cout << "join thread " << td.get_id() << std::endl;td.join();}}
}
使用线程池
线程池的使用可以通过如下方式投递任务,任务在后台自动执行
void Test(){SeqScheduler::Inst().CommitTask([]() {asyncLog("slot machine perfusion called ");});
}
如需等待任务完成,可以用wait或者get
void Test(){auto task_future = SeqScheduler::Inst().CommitTask([]() {asyncLog("slot machine perfusion called ");});task_future.wait();
}
相关文章:
C++ 封装线程池(结合QT支持信号机制)
纯C风格线程池 纯C 风格线程池可参考这篇文章 https://llfc.club/category?catid225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2c2IJUcCUOfzEQQRRdOXYIZuCjP 视频教程 相关线程池和并发编程的视频可以看看这个连接: https://www.bilibili.com/video/BV1Xt421H7M7/?vd_s…...
c# 学习教程
打印语句 折叠代码 变量 整形 浮点型 特殊类型...
【ros2】入门
ros2 在机器人控制,无人机飞行控制,自动驾驶领域,ros2可是如日中天的存在。无论是学习其架构设计,还是使用ros2开发机器人,ros2的是一个很错的选择。 安装 在ros2的,推荐“小鱼”的工具 wget http://fishros.com/i…...
网络安全基础技术扫盲篇 — 名词解释之“数据包“
用通俗易懂的话说: 数据包就像是一个信封。当你写信给某个人时,你将内容写在一张纸上,然后将纸叠起来并放入信封中,就形成了一个完整要发送的数据内容。信封上有发件人和收件人的详细地址,还有一些其他必要的信息&…...
26 _ 虚拟DOM:虚拟DOM和实际的DOM有何不同?
虚拟DOM是最近非常火的技术,两大著名前端框架React和Vue都使用了虚拟DOM,所以我觉得非常有必要结合浏览器的工作机制对虚拟DOM进行一次分析。当然了,React和Vue框架本身所蕴含的知识点非常多,而且也不是我们专栏的重点,…...
C语言(内存函数)
Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…...
JVM之【执行引擎】
执行引擎 执行引擎是JVM的核心组件之一,它负责将Java字节码文件转换为机器指令并执行。这一过程涉及多个组成部分,各部分协同工作来完成字节码到机器指令的转换和执行。以下是执行引擎的主要组成部分及其作用: 1. 解释器(Interp…...
maven部署到私服
方法一:网页上传 1、账号登录 用户名/密码 2、地址 http://自己的ip:自己的端口/nexus 3、查看Repositories列表,选择Public Repositories,确定待上传jar包不在私服中 4、选择3rd party仓库,点击Artifact Upload页签 5、GAV Definition选…...
Android精通值Fragment的使用 —— 不含底层逻辑(五)
1. Fragment 使用Fragment的目标:根据列表动态显示内容,更简洁显示界面、查找界面 eg. 使用新闻列表动态显示新闻 1.1 Fragment的特性 具备生命周期 —— 可以动态地移除一些Fragment必须委托在Activity中使用可以在Activity中进行复用 1.2 Fragmen…...
apache大数据各组件部署搭建(超级详细)
apache大数据数仓各组件部署搭建 第一章 环境准备 1. 机器规划 准备3台服务器用于集群部署,系统建议CentOS7+,2核8G内存 172.19.195.228 hadoop101 172.19.195.229 hadoop102 172.19.195.230 hadoop103 [root@hadoop101 ~]# cat /etc/redhat-release CentOS Linux rele…...
Servlet搭建博客系统
现在我们可以使用Servlet来搭建一个动态(前后端可以交互)的博客系统了(使用Hexo只能实现一个纯静态的网页,即只能在后台自己上传博客)。有一种"多年媳妇熬成婆"的感觉。 一、准备工作 首先创建好项目,引入相关依赖。具体过程在"Servlet的创建"中介绍了。…...
NextJs 渲染篇 - 什么是CSR、SSR、SSG、ISR 和服务端/客户端组件
NextJs 渲染篇 - 什么是CSR、SSR、SSG、ISR 和服务端/客户端组件 前言一. 什么是CSR、SSR、SSG、ISR1.1 CSR 客户端渲染1.2 SSR 服务端渲染1.3 SSG 静态站点生成① 没有数据请求的页面② 页面内容需要请求数据③ 页面路径需要获取数据 1.4 ISR 增量静态再生1.5 四种渲染方式的对…...
Python 二叉数的实例化及遍历
首先创建一个这样的二叉树,作为我们今天的实例。实例代码在下方。 #创建1个树类型 class TreeNode:def __init__(self,val,leftNone,rightNone):self.valvalself.leftleftself.rightright #实例化类 node1TreeNode(5) node2TreeNode(6) node3TreeNode(7) node4Tre…...
计算 x 的二进制表示中 1 的个数
计算 x 的二进制表示中 1 的个数 代码如下: int func(int x){int countx 0;while (x>0){countx;x x & (x - 1);}return countx;} 完整代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat…...
基于Vue的前端瀑布流布局组件的设计与实现
摘要 随着前端技术的不断演进,复杂业务场景和多次迭代后的产品对组件化开发提出了更高的要求。传统的整块应用开发方式已无法满足快速迭代和高效维护的需求。因此,本文将介绍一款基于Vue的瀑布流布局组件,旨在通过组件化开发提升开发效率和降…...
WinSW使用说明
WinSW使用说明 Windows系统下部署多个java程序 场景: 多个java的jar程序,通常来说一个程序使用一个cmd窗口,通过java -jar xxx.jar 命令来运行。这样如果程序多了打开cmd窗口也就多了。 解决: 通过使用WinSW程序,把ja…...
SpringBoot 多模块 多环境 项目 单元测试
环境描述 假设项目中有以下三个yml文件: application.ymlapplication-dev.ymlapplication-prod.yml 假设项目各Module之间依赖关系如下: 其中,D依赖C,C依赖B,B依赖A,D对外提供最终的访问接口 现在要想采…...
网络安全法中的网络安全规定和措施
《中华人民共和国网络安全法》是中国首部全面规范网络空间安全管理的基础性法律,旨在加强网络安全,保障国家安全和社会公共利益,保护公民、法人和其他组织的合法权益,促进互联网的健康发展。以下是该法律中关于网络安全的一些核心…...
一、搭建 Vue3 Admin 项目:从无到有的精彩历程
在前端开发的领域中,Vue3 展现出了强大的魅力,而搭建一个功能丰富的 Vue3 Admin 项目更是充满挑战与乐趣。今天,我将和大家分享我搭建 Vue3 Admin 项目的详细过程,其中用到了一系列重要的依赖包。 首先 让我们开启这个旅程。在确…...
Qt | Qt 资源简介(rcc、qmake)
1、资源系统是一种独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件(前面所讨论的数据都存储在外部设备中)。若应用程序始终需要一组特定的文件(比如图标),则非常有用。 2、资源系统基于 qmake,rcc(Qt 的资源编译器,用于把资源转换为 C++代码)和 QFile …...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
