C++ 并发编程指南(13)线程池原理与实践 | 13.1、实现原理

文章目录

  • 一、线程池原理与实践
    • 1、线程池的概念
    • 2、线程创建和销毁的开销有哪些?
      • 2.1、系统资源消耗
      • 2.2、初始化与清理
      • 2.3、上下文切换
      • 2.4、性能影响
      • 2.5、线程池的优势
      • 总结
    • 3、线程池的机制

前言:

在多线程编程中,线程池是一种常用的技术,它可以有效地管理和调度线程。C++标准库中的和头文件提供了对线程池的支持。本文将介绍C++线程池的机制和原理。

一、线程池原理与实践

1、线程池的概念

线程池是一种线程使用模式,它通过预先创建多个线程,将任务提交给线程池,由线程池负责调度和执行任务。线程池的主要作用是减少线程创建和销毁的开销,提高程序的并发性能

2、线程创建和销毁的开销有哪些?

线程创建与销毁的开销主要体现在以下几个方面:

2.1、系统资源消耗

  • 内存分配:线程的创建需要为其分配一定的内存空间,以存储线程栈、线程控制块等数据结构。这些内存空间的分配和回收都需要消耗系统资源。
  • 内核对象:在操作系统层面,线程的创建会涉及到内核对象的创建,这些对象用于管理线程的状态、优先级、调度等信息。同样地,线程的销毁也需要销毁这些内核对象。

2.2、初始化与清理

  • 初始化:线程的创建需要进行一系列的初始化操作,如设置线程栈、初始化线程控制块等。这些操作都需要消耗一定的计算资源。
  • 清理:线程的销毁需要执行一系列的清理操作,如释放线程栈、销毁线程控制块等。这些操作同样需要消耗计算资源。

2.3、上下文切换

  • 当一个线程被创建或销毁时,操作系统需要进行上下文切换。上下文切换涉及到保存当前线程的上下文(如寄存器值、栈信息等)和加载新线程的上下文。这个过程需要消耗一定的CPU时间。

2.4、性能影响

  • 创建开销:线程的创建通常比进程的创建要快,但在某些操作系统上,线程的创建仍然是一个相对昂贵的操作。例如,在Solaris 2操作系统上,创建进程的时间大约是创建线程的30倍。
  • 销毁开销:线程的销毁同样需要一定的开销,特别是当线程被频繁创建和销毁时,这种开销会更加明显。

2.5、线程池的优势

  • 减少开销:线程池通过预先创建一定数量的线程,并在需要时复用这些线程来执行任务,从而避免了频繁创建和销毁线程的开销。
  • 提高性能:线程池通过限制并发线程的数量和有效地管理线程资源,可以提高系统的性能和资源利用率。

总结

线程创建与销毁的开销主要包括系统资源消耗、初始化与清理、上下文切换以及性能影响等方面。这些开销可以通过使用线程池等技术来降低,从而提高系统的整体性能和资源利用率。

3、线程池的机制

C++线程池主要由以下几个部分组成:

  • 任务队列:用于存放待执行的任务。这些任务通常以函数对象、函数指针或可调用对象的形式存在。
  • 线程集合:包含了一定数量的工作线程,这些线程会不断地从任务队列中取出任务并执行。
  • 同步机制:用于协调线程之间的任务分配和状态同步。常见的同步机制包括互斥锁(mutex)、条件变量(condition variable)等。
  • 线程管理:包括线程的创建、销毁、启动和停止等管理操作。为了优化性能,线程池通常会限制线程的最大数量,避免过多的线程创建和销毁开销。
#ifndef __THREAD_POOL_H__
#define __THREAD_POOL_H__#include <atomic>
#include <condition_variable>
#include <future>
#include <iostream>
#include <mutex>
#include <queue>
#include <thread>
#include <vector>
#include <functional>class NoneCopy {public:~NoneCopy(){}
protected:NoneCopy(){}
private:NoneCopy(const NoneCopy&) = delete;NoneCopy& operator=(const NoneCopy&) = delete;
};class ThreadPool : public NoneCopy {
public://继承基类NoneCopy就不需要写如下删除了//ThreadPool(const ThreadPool&) = delete;//ThreadPool& operator=(const ThreadPool&) = delete;static ThreadPool& instance() {static ThreadPool ins;return ins;}using Task = std::packaged_task<void()>;~ThreadPool() {stop();}template <class F, class... Args>auto commit(F&& f, Args&&... args) ->std::future<decltype(std::forward<F>(f)(std::forward<Args>(args)...))> {using RetType = decltype(std::forward<F>(f)(std::forward<Args>(args)...));if (stop_.load())return std::future<RetType>{};auto task = std::make_shared<std::packaged_task<RetType()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));std::future<RetType> ret = task->get_future();{std::lock_guard<std::mutex> cv_mt(cv_mt_);tasks_.emplace([task] { (*task)(); });}cv_lock_.notify_one();return ret;}int idleThreadCount() {return thread_num_;}private:ThreadPool(unsigned int num = std::thread::hardware_concurrency()): stop_(false) {{/*if (num <= 1)thread_num_ = 2;elsethread_num_ = num;*/thread_num_ = 10;}start();}void start() {for (int i = 0; i < thread_num_; ++i) {pool_.emplace_back([this]() {while (!this->stop_.load()) {Task task;{std::unique_lock<std::mutex> cv_mt(cv_mt_);this->cv_lock_.wait(cv_mt, [this] {return this->stop_.load() || !this->tasks_.empty();});if (this->tasks_.empty())return;task = std::move(this->tasks_.front());this->tasks_.pop();}this->thread_num_--;task();this->thread_num_++;}});}}void stop() {stop_.store(true);cv_lock_.notify_all();for (auto& td : pool_) {if (td.joinable()) {std::cout << "join thread " << td.get_id() << std::endl;td.join();}}}private:std::mutex               cv_mt_;std::condition_variable  cv_lock_;std::atomic_bool         stop_;std::atomic_int          thread_num_;std::queue<Task>         tasks_;std::vector<std::thread> pool_;
};#endif  // !__THREAD_POOL_H__

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

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

相关文章

串联式固定测斜仪无需钢丝绳、安装方便、可回收利用边坡基坑矿山地灾常用

一、固定式测斜仪的简介 固定测斜仪是一种用于长期自动监测各种结构物的深层水平位移的设备&#xff0c;获取土体内部的位移变化趋势&#xff0c;监测数据上传至安锐测控云平台&#xff0c;用户即可实时查看结构深层水平位移数据&#xff0c;实时预警&#xff0c;保障结构的安全…

python最新ARIMA模型预测未来汽车销售额

用新版本ARIMA编译运行时会出现一些问题 如ARIMA模型,用BIC矩阵确定p、q参数的时候BIC矩阵输出全是None 如model.summary2()是没有的 arima.py # -*- coding: utf-8 -*-import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] = [SimHei…

小炒 20240606

1 一些人做“人上人”的念头是从小就被植入到脑子里的&#xff0c;凡事都要和人比较&#xff0c;只有在比较中找到优越感&#xff0c;高人一头才能显得自己优秀。 比不上行内精英&#xff0c;就去和部门同事比&#xff0c;比不过同事&#xff0c;就去和亲戚、家人比&#xff…

实时跨境电商数据监控:快速响应市场变化与竞争动态

在电商领域&#xff0c;市场变化与竞争动态无时无刻不在影响着商家的业务决策。实时数据监控作为一种高效的工具&#xff0c;能够帮助电商平台快速响应这些变化&#xff0c;从而保持竞争优势。实时数据分析涵盖了从价格动态监控到客户行为分析等多个方面&#xff0c;以下将详细…

BeatGAN:使用对抗生成时间序列的异常心律检测

BeatGAN&#xff1a;使用对抗生成时间序列的异常心律检测 原创 小王搬运工 时序课堂 2024-06-07 14:28 四川 论文地址&#xff1a;https://dl.acm.org/doi/abs/10.5555/3367471.3367658 论文源码&#xff1a;https://github.com/Vniex/BeatGAN 期刊&#xff1a;IJCAI19: Pro…

特征提取(Feature Extraction)评估特征对模型性能的实际贡献(六)

为了评估特征对模型性能的实际贡献&#xff0c;我们可以使用以下几种方法和标准来衡量每个特征在模型中的重要性和影响。这些方法和标准不仅有助于识别对模型预测能力最有贡献的特征&#xff0c;还能帮助我们优化模型性能。下面详细介绍一些常用的评估方法&#xff0c;并给出相…

视觉SLAM十四讲:从理论到实践(Chapter9:后端1)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 一、目标 1.理解后端的概念。 2.理解以EKF为代表的滤波器后端的工作原理。 3.理解非线性优化的后端&#xff0c;明白稀疏性是如何利用的。 4.使用g2o和Ceres实际操作…

浅浅写一个Word、PowerPoint、Excel文档转PDF工具

前言 最近在搞知识库&#xff0c;需要把各种 Word、PowerPoint、Excel 文件转换成 PDF 文件&#xff0c;不然 Word 中的表格中的文字提取会出现一些问题&#xff1b;使用 Office 或者 WPS 将大量文件转换成 PDF 需要频繁重复打开文件&#xff0c;点击保存为PDF&#xff0c;然后…

谁懂啊!第一次用AI绘画做表情包,居然直接爆收入了!

大家好&#xff0c;我是设计师阿威 我的第一套表情包上周六上午11点终于在微信的表情商店上架啦&#xff01; 为什么说“终于”&#xff1f; 那是因为背后是无数次的努力–>被退回–>反复修改–>再提交–>再被退回–>再精心修改–>终于通过啦&#xff01;…

服务器硬件介绍(1)

硬件设备 服务器&#xff1a;数据中心的核心组件是服务器&#xff0c;它提供计算能力和数据存储解决方案。服务器通常配备多核处理器、大量RAM和高速存储系统&#xff0c;以满足高并发处理和大数据存储的需求。工作站&#xff1a;工作站是专业用户执行复杂计算任务和数据处理的…

电脑知识 如何看懂串口通信协议(程序员视角)

目录 前言 一、串口文档 二、明确身份 三、串口设置 四、看懂命令格式 五、看懂发送命令的格式 1.帧头和帧尾 2.帧内数据长度 3.帧内数据/具体命令 4.整体命令 5.真正的命令字和命令值 六、第一个案例 1.发送命令 2.雷达的回答 七、作者的话 前言 用一个案例&#…

提升学校管理效率,智慧校园解决方案来袭

你是不是曾为学校管理效率低下而困扰&#xff1f;是不是对传统的教育模式感到力不从心&#xff1f;现在&#xff0c;一个划时代的解决方案来啦——智慧校园&#xff01; 随着科技的不断发展&#xff0c;智慧校园正逐渐改变着学校的管理方式。通过将信息技术与教育相结合&#x…

照片数据恢复,6个策略轻松恢复!

“我在电脑上保存了很多照片&#xff0c;在清理电脑时一不小心误删了&#xff0c;现在完全没办法将它们找回&#xff0c;大家有什么方法吗&#xff1f;希望给我一些建议。” 在数字时代&#xff0c;照片成为了我们记录生活、珍藏回忆的重要载体。无论是旅行中的风景照、家庭聚会…

Spring中的事务传递性小记

在Spring中&#xff0c;事务的传递性主要由Propagation属性控制&#xff0c;它定义了当方法被其他方法调用时&#xff0c;应该如何处理事务。Propagation属性有以下几种值&#xff1a; PROPAGATION_REQUIRED&#xff1a;如果当前没有事务&#xff0c;就新建一个事务&#xff0…

聊一聊资源监控

聊一聊资源监控 为什么要进行资源监控&#xff1f; 为什么在稳定性测试的时候需要进行相应的资源监控呢&#xff1f;简单来说因为我们需要知道在程序运行的时候能够主动观察到资源的消耗情况以便及时发现问题 怎么进行监控&#xff1f; 目前我们常用对资源的监控可以分为如…

Spring Boot 项目打包 + Shell 脚本部署详细总结

Spring Boot 项目打包 Shell 脚本部署详细总结 在现代企业应用开发中&#xff0c;Spring Boot项目的自动化部署是一个非常重要的环节。通过自动化部署&#xff0c;我们可以减少人为操作带来的错误&#xff0c;提高部署效率和可靠性。本文将详细介绍如何将Spring Boot项目打包…

为什么C#越学越陌生,搞那么多奇怪的东西?

绝大多数编程语言&#xff0c;除了基础语法&#xff0c;其他的都是可选的工具&#xff0c;可用可不用&#xff0c;顺手你就用&#xff0c;不顺手就别用。 刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点…

啥是多边央行数字货币桥项目(个人技术理解)

&#xff08;1&#xff09;是啥&#xff1a;是基于CBDC&#xff08;央行发行的电子货币&#xff09;的跨境支付互联互通的一种尝试&#xff0c;是点对点的交易。交易时商业银行作为同步节点&#xff08;点对点转账中的点&#xff09;&#xff0c;央行作为共识节点&#xff08;点…

vue3第三十八节(TS 之 class 类实现及使用)

引言&#xff1a;面相对象编程在我们工作中必须同时也是不可或缺的一部分&#xff0c;想要对JavaScript | TypeScript 有更加深刻的理解应用&#xff0c;我们需要充分学习应用 1、类的基本用途 在TS中 类描述了所创建的对象共同的属性和方法。TypeScript 支持面向对象的所有特…

钉钉二次开发-企业内部系统集成官方OA审批流程

场景&#xff1a;企业内部开发人员不足&#xff0c;需要从以前集成Activiti的方式转换成集成钉钉官方OA审批流程&#xff0c;提高开发效率和系统稳定性。 摘要&#xff1a;企业内部系统集成Acitiviti开源工作流存在的问题&#xff1a; 1. 企业需要单独搭建工作流服务&#xff…