首页 > 编程语言 >【C++】线程池

【C++】线程池

时间:2024-09-26 11:05:15浏览次数:1  
标签:销毁 创建 C++ 并发 任务 线程 CPU

C++线程池

1.什么是线程池?解决什么问题?

C++线程池(ThreadPool)的出现主要是为了解决以下几个问题:

  1. 性能:创建和销毁线程都是相对昂贵的操作,特别是在高并发场景下,频繁地创建和销毁线程会极大地降低程序的性能。通过线程池预先创建一定数量的线程并保存在内存中,可以避免频繁地创建和销毁线程,从而提高程序的性能。
  2. 资源管理:线程是操作系统级别的资源,如果线程数量过多,可能会导致系统资源的过度消耗,甚至可能导致系统崩溃。通过线程池,可以控制同时运行的线程数量,避免资源过度消耗。
  3. 任务调度:线程池可以更方便地进行任务的调度。通过线程池,可以将任务分配给不同的线程执行,实现并行处理,提高程序的执行效率。
  4. 简化编程:使用线程池可以简化多线程编程的复杂性。程序员只需要将任务提交给线程池,而不需要关心线程的创建、管理和销毁等细节,降低了多线程编程的难度。

因此,C++线程池的出现是为了解决在高并发场景下创建和销毁线程的开销问题,提高程序的性能和并发处理能力,简化多线程编程的复杂性

2.原理

线程池初始化时,初始化线程,也可以生成一个管理线程,来管理工作线线程数量。
如果当前任务队列一直有很多任务时,说明线程繁忙,处理不过来,可以根据设置的最大工作线程数来新增线程,提高并发处理能力,提高工作效率。
如果当前任务队列一直为空,说明当前时间段,没有任务或者很少的任务要处理,可以销毁多余的空闲线程,避免资源浪费。

如下图所示:

初始化线程池后,有新任务到来后,线程池处理流程为:
将新任务投递到任务队列中->发送信号通知线程处理->空闲线程处理->处理完成检查任务队列是否还有任务->有任务则提取任务处理,没有任务就挂起为空闲线程,避免占用系统资源

如下图所示:

3.总结

在处理多个相同任务的时候,线程池(线程数量为4时)的速度几乎是单线程的4倍,当然,线程数不是越多越好,取决于CPU的核数(最好不要大于CPU的核数,因为太多的工作线程会竞争CPU的资源,带来不必要的上下文切换,小于CPU的核数则不能够充分利用CPU)。

对于某些场景,使用线程池是很有必要的,在需要高并发的服务器中线程池几乎是必备的,如文件传输的服务器,多用户下载或者上传文件时,几乎是同步的,在高并发场景下,如果每个请求都创建一个新线程,会导致线程数量过多,同时线程的创建和销毁也需要消耗大量的资源。为了解决这些问题,可以使用线程池技术。线程池预先创建一定数量的线程,并且可以在多个请求之间复用这些线程,从而提高服务器的处理能力和资源利用率。因此,在高并发的服务器中,使用线程池技术可以有效地降低资源消耗、提高系统性能和响应速度,是非常必要和常用的技术手段之一。

虽然现在有很多封装好的线程池供我们调用。但是,其原理也是值得我们推敲的。

标签:销毁,创建,C++,并发,任务,线程,CPU
From: https://www.cnblogs.com/AirCL/p/18433032

相关文章

  • 开源!Pod高负载自动打印JAVA线程堆栈
    开源!Pod高负载自动打印JAVA线程堆栈运维技术探讨  2024年08月29日17:39 广东 以下文章来源于SRE运维手记 ,作者亦零一SRE运维手记.一个在房地产、家居科技、游戏和电商行业摸爬滚打的运维老司机#sre#k8s#kubernetes#prometheus#devops01背景     在......
  • 【C++】C++核心编程
    C++核心编程本阶段主要针对C++面向对象编程技术,C++中的核心和精髓。1.内存分区模型C++程序在执行时,将内存大方向分为4个区域:代码区:存放函数体的二进制代码,由操作系统进行管理全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆......
  • 【C++】C++提高编程
    C++提高编程本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用1.模板1.1模板的概念模板就是建立通用的模具,大大提高复用性模板的特点:模板不可以直接使用,只是一个框架模板的通用并不是万能的1.2函数模板C++另一种编程思想称为泛型编程,主要利用技术......
  • 【C++】C++基础知识
    C++基础1.指针1.1定义与使用指针在内存中占多少字节?指针在32位操作系统中占4个字节,在64位操作系统中占8个字节。定义指针的两种方式如下/***定义指针的两种形式*///1.inta=10;int*p;p=&a;//2.int*p2=&a;1.2空指针与野指针空指针空指针......
  • 广州C++信奥老师解一本通题 1260:1282:最大子矩阵
    ​ 【题目描述】已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1×1)子矩阵。比如,如下4×4的矩阵0 -2-7 09 2-6 2-4 1-4 1-1 8 0-2 的最大子矩阵是92-41-18 这个子矩阵的大小是15......
  • .NetCore MySqlException 多线程中(There is already an open DataReader associated w
    问题描述:其实标题只是遇到问题的其中之一,遇到三种异常信息如下:Lockwaittimeoutexceeded;tryrestartingtransaction大概意思:超过锁定等待超时;尝试重新启动事务 ThereisalreadyanopenDataReaderassociatedwiththisConnectionwhichmustbeclosedfirst.大......
  • 如何解决 :libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found
    如何解决:libstdc++.so.6:version`GLIBCXX_3.4.30‘notfound问题描述:当您尝试在Linux系统上运行某个程序或软件时,有时会遇到一个错误,提示libstdc++.so.6:versionGLIBCXX_3.4.30notfound。这个错误表明您的系统缺少某个特定版本的C++标准库,具体来说就是GLIBCXX_3.4.30......
  • C++ 的异常安全理念
    C++中的异常安全是一个至关重要的概念,它关乎到程序的健壮性、资源管理和数据状态的一致性。以下是对C++异常安全的详细解析:一、异常安全的概念异常安全是指在程序面对函数或方法可能抛出异常的情况下,仍能保证资源的正确释放和数据状态的一致性。这要求程序在异常发生时,能够妥......
  • 多线程极速导出/9字段10W行只需2秒/导入导出打印组件/功能丰富简单易用
    一、功能特点组件同时集成了导出数据到csv、xls、pdf和打印数据。所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便。同时支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等数据源。提供静态方法直接传入QTableView、QTab......
  • C++ day06
    手动实现栈:#include<iostream>#include<cstring>usingnamespacestd;classStatic{private:int*arr;//动态分配栈inttop;//指向栈顶元素intcapacity;//记录栈的最大容量public://有参构造函数Static(i......