C++的并发世界(十一)——线程池

news/2024/5/9 21:54:59/文章来源:https://blog.csdn.net/qq_35789421/article/details/137596521

0.线程池的概念

在这里插入图片描述

1.线程池使用步骤

①初始化线程池:确定线程数量,并做好互斥访问;
②启动所有线程
③准备好任务处理基类;
④获取任务接口:通过条件变量阻塞等待任务

2.atomic原子操作

'std:atomic`是C++11标准库中的一个模板类,用于实现多线程环境下的原子操作。它提供了一种线程安全的方式来访问和修改共享变量,可以避免多线程环境中的数据竞争问题,'std:atomic’的使用方式类似于普通的C++变量,但是它的操作是原子性的。也就是说,在多线程环境下,多个线程同时对同一个’std:atomic变量进行操作时,不会出现数据竞争问题。

3.线程池案例

①threadpool.cpp

#include "threadpool.h"void XThreadPool::Init(int num)
{std::unique_lock<std::mutex> lock(__mux__);thread_num = num;std::cout << "Thread pool Init: " << num << std::endl;
}void XThreadPool::Start()
{std::unique_lock<std::mutex> lock(__mux__);if (thread_num <= 0){std::cerr << "Please Init XThreadPool !" << std::endl;return;}if (!threads.empty()){std::cerr << "Thread Pool has start!" << std::endl;return;}for (int i = 0; i < thread_num; i++){auto th = std::make_shared<std::thread>(&XThreadPool::Run, this);threads.push_back(th);}
}void XThreadPool::Run()
{std::cout << "begin XThreadPool Run: " << std::this_thread::get_id() << std::endl;while (true){auto task = GetTask();if (!task){continue;}++__task_run_count__;try{auto re = task->Run();task->Setvalue(re);}catch (...){}--__task_run_count__;}std::cout << "end XThreadPool Run: " << std::this_thread::get_id() << std::endl;
}void XThreadPool::AddTask(XTask *task)
{std::unique_lock<std::mutex> lock(__mux__);tasks.push_back(task);task->is_exit = [this] {return is_exit(); }
}XTask* XThreadPool::GetTask()
{std::unique_lock<std::mutex> lock(__mux__);if (tasks.empty()){__cv__.wait(lock);}auto task = tasks.front();tasks.pop_front();return task;
}void XThreadPool::Stop()
{exit = true;__cv__.notify_all();for (auto &th : threads){th->join();}std::unique_lock<std::mutex> lock(__mux__);threads.clear();
}

②threadpool.h

#pragma once#include <thread>
#include <mutex>
#include <vector>
#include <list>
#include <iostream>
#include <string>
#include <condition_variable>
#include <functional>
#include <atomic>
#include <future>class XTask
{public:virtual int Run() = 0;std::function<bool()> is_exit = nullptr;void Setvalue(int v) { __p__.set_value(v); }auto GetValue() { return __p__.get_future().get(); }private:std::promise<int> __p__;//用来接收返回值
};class XThreadPool
{public:void Init(int num);void Start();//所有线程启动函数void Stop();//线程池退出void AddTask(XTask *task);XTask* GetTask();bool is_exit() { return exit; }int task_run_count() { return __task_run_count__; }private:int thread_num = 0;std::mutex __mux__;void Run();//线程池线程入口函数std::vector<std::shared_ptr<std::thread>> threads;std::list<XTask*> tasks;std::condition_variable __cv__;bool exit = false;std::atomic<int> __task_run_count__ = {0};//正在运行的任务数量
};

③main.cpp

#include "threadpool.h"class MyTask :public XTask
{public:int Run(){std::cout <<"==============================================" << std::endl;std::cout << std::this_thread::get_id() << "-Mytask" << name << std::endl;std::cout << "==============================================" << std::endl;for (int i = 0; i < 10; i++){if(is_exit()){break;}std::cout << "." << std::flush;std::this_thread::sleep_for(std::chrono::microseconds(500));}return 0;}std::string name = "";
};int main()
{XThreadPool pool;pool.Init(16);pool.Start();MyTask task1;task1.name = "test name 001";pool.AddTask(&task1);MyTask task2;task2.name = "test name 002";pool.AddTask(&task2);std::this_thread::sleep_for(std::chrono::seconds(100));std::cout << "task run count =" << pool.task_run_count() << std::endl;MyTask task3;task3.name = "test name 003";pool.AddTask(&task3);MyTask task4;task4.name = "test name 004";pool.AddTask(&task4);std::cout << "task run count = " << pool.task_run_count() << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));pool.Stop();std::cout << "task run count =" << pool.task_run_count() << std::endl;getchar();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1045488.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发actions…

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法&#xff0c;用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中&#xff0c;首先通过getElementById方法获取id为"myCanvas"的Canvas元素&#xff0c;然后使用getContext(“2d”)方法获取该Ca…

MySQL学习笔记(数据类型, DDL, DML, DQL, DCL)

Learning note 1、前言2、数据类型2.1、数值类型2.2、字符串类型2.3、日期类型 3、DDL总览数据库/表切换数据库查看表内容创建数据库/表删除数据库/表添加字段删除字段表的重命名修改字段名&#xff08;以及对应的数据类型&#xff09; 4、DML往字段里写入具体内容修改字段内容…

【Java网络编程】OSI七层网络模型与TCP/IP协议簇

1.1、OSI七层网络模型 OSI七层网络模型中&#xff0c;每层的功能如下&#xff1a; 应用层&#xff1a;人与计算机网络交互的窗口。表示层&#xff1a;负责数据格式的封装&#xff0c;如加密、压缩、编解码等。会话层&#xff1a;建立、终止、管理不同端间的会话连接。传输层&a…

【linux】基础IO(四)

在上一篇基础IO中我们主要讲述了文件再磁盘中的存储&#xff0c;当然我们说的也都只是预备知识&#xff0c;为这一篇的文件系统进行铺垫。 目录 搭文件系统的架子&#xff1a;填补细节&#xff1a;inode&#xff1a;datablock[]: 更上层的理解&#xff1a; 搭文件系统的架子&a…

PTA 探索地道战

地道战是在抗日战争时期&#xff0c;在华北平原上抗日军民利用地道打击日本侵略者的作战方式。地道网是房连房、街连街、村连村的地下工事&#xff0c;如下图所示。 我们在回顾前辈们艰苦卓绝的战争生活的同时&#xff0c;真心钦佩他们的聪明才智。在现在和平发展的年代&#x…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

Vue学习笔记-S1

1 什么是Vue Vue是一款用于构建用户界面的渐进式JavaScripte框架&#xff0c;可基于数据渲染用户页面. 1.1 Vue的知识架构 Vue核心包&#xff1a;声明式渲染、组件系统Vue构建&#xff1a;客户端路由、状态管理、构建工具局部使用Vue&#xff1a;快速入门、常用指令、生命周…

计算机组成结构—外部存储器

目录 一、磁盘存储器 1. 磁表面存储器和磁记录原理 2. 硬磁盘的分类和基本结构 &#xff08;1&#xff09;硬磁盘存储器的分类 &#xff08;2&#xff09;硬磁盘存储器的组成 3. 磁盘的工作原理 &#xff08;1&#xff09;磁盘存储区域 &#xff08;2&#xff09;磁盘地…

学习记录15-运算放大器例题1

一、例题1 图中自己加的一些声明&#xff0c;方便待会讲解&#xff08;请忽略丑。。。&#xff09; 根据虚短原则&#xff1a;U U- U 3V*(R4/(R3R4)) 3V*&#xff08;20 / (1020)) 2V U- U- -1V*(R2/(R1R2))Uo*(R1/(R1R2)) -1V*(20/30)Uo*(10/30) -2/3VUo*1/3 …

java算法day50 | ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 思路&#xff1a; 这道题的关键就是如何设置dp数组的状态。用五种状态表示对股票持有或售出的不同阶段。代码随想录讲解视频 class Solution {public int maxProfit(int[] prices) {int[][] dpnew int[prices.length][5];dp[0][0]0;dp[0][1]-prices…

Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点&#xff1a; 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

无线游戏手柄的测试(Windows11系统手柄调试方法)

实物 1、把游戏手柄的无线接收器插入到电脑usb接口中 2、【控制面板】----【查看设备和打印机】 3、【蓝牙和其它设备】--【更多设备和打印机设置】 4、鼠标右键【游戏控制器设置】 5、【属性】 </

Python程序设计 列表

教学案例八 列表 1. 计算并显示斐波那契数列 输入n,计算并显示斐波那契数列前n项.一行打印5项&#xff0c;每项显示宽度为6 什么是斐波那契数列 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、 因数学家莱昂纳多斐波那契&#xff…

机器学习的15个概念

机器学习 有监督学习 有监督学习是利用训练数据集进行预测的机器学习任务。有监督学习可以分为分类和回归。回归用于预测“价格”“温度”或“距离”等连续值&#xff0c;而分类用于预测“是”或“否”、“垃圾邮件”或“非垃圾邮件”、“恶性”或“良性”等类别。 分类包含…

番外篇 | YOLOv8改进之引入YOLOv9的ADown模块 | 替换YOLOv8卷积

前言:Hello大家好,我是小哥谈。YOLOv9是一种目标检测算法,而ADown模块是YOLOv9中的一个重要组成部分。ADown模块主要用于特征提取和下采样操作,以便在后续的检测任务中更好地捕捉目标的特征。具体来说,ADown模块是YOLOv9中的一个卷积块,由一系列卷积层和池化层组成。它的…

基于SSM+Jsp+Mysql的超市管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

c++的学习之路:22、多态(1)

摘要 本章主要是说一些多态的开头。 目录 摘要 一、多态的概念 二、多态的定义及实现 2.1、多态的构成条件 2.2、虚函数 2.3、虚函数的重写 2.4、C11 override 和 final 2.5、重载、覆盖(重写)、隐藏(重定义)的对比 三、思维导图 一、多态的概念 多态的概念&#…