cpp11实现线程池(一)——项目介绍

news2024/12/22 16:11:15

项目介绍

线程池是库的形式提供给用户,是必须放到代码中,不能单独运行,亦称为基础组件

第一版线程池任务对象使用继承技术,提供一个抽象基类Task,里面有一个纯虚函数run(),使用时继承该类,并重写该纯虚函数,在这个重写的纯虚函数中完成要执行的具体任务;

第二版线程池使用C++11 的std::packaged_task<T>来包装任务执行函数,用std::future<T>来接受任意类型的结果

完整源代码

https://github.com/StrikeCode/cpp11_threadpool.git

技术点

熟练基于C++ 11标准的面向对象编程

组合和继承、继承多态、STL容器、智能指针、函数对象、绑定器、可变参模板编程等。

熟悉C++11多线程编程

threadmutexatomiccondition_variableunique_lock等。

C++17和C++20标准的内容

C++17的any类型和C++20的信号量semaphore,项目上都我们自己用代码实现。

熟悉多线程理论

多线程基本知识、线程互斥、线程同步、原子操作、CAS等。

线程池优点

服务进程启动之初,就实现创建好线程池,当业务流量到来时,需要线程就可以直接从线程池获取线程执行业务处理,不需要来一个任务创建一个线程,执行完任务再销毁线程,减少了线程的创建与销毁的开销

fixed线程池模式

线程池里面的线程个数是固定不变的,一般是ThreadPool创建时根据当前机器的CPU核心数量进行指定。

cached模式线程池

线程池里面的线程个数是可动态增长的,根据任务的数量动态的增加线程的数量,但是会设置一个线程数量的阈值(线程过多的坏处上面已经讲过了),任务处理完成,如果动态增长的线程空闲了60s还没有处理其它任务,那么关闭线程,保持池中最初数量的线程即可

多线程优势

多线程程序就一定好吗?不一定,需要具体分析场景

IO密集型

无论是CPU单核或者CPU多核还是多CPU,都是适合多线程(因为IO多就会造成CPU空闲)

CPU密集型

CPU单核情况下,不适合多线程,因为多线程存在上下文切换的开销,不如单线程直接执行完成,因为CPU密集型场景也不怎么到等待状态

线程池的开销

为了完成任务,创建很多的线程可以吗?

  • 线程的创建和销毁都是非常"重"的操作, 需要创建相应的数据结构如PCB task_struct,需要描述地址空间相应的数据结构 vm_struct、vm_area_struct,需要创建相应的页目录和页表项;
  • 线程栈(线程执行函数会使用到)本身占用大量内存,32位机一般一个进程最多只能创建380个线程左右,因为:
  • 假设一个线程需要8M内存空间,一个进程的虚拟内存用户空间为3G,3G/8M = 384;
  • 线程的上下文切换要占用大量时间;
  • 大量线程同时唤醒会使系统经常出现锯齿状负载或者瞬间负载量很大导致宕机,比如同一时间很多IO操作的已经完成

线程同步

竞态条件

指设备或系统临界区代码段出现不恰当的执行时序,而得到不正确的结果

如果多线程环境下不存在竞态条件,则称为可重入(多线程)的代码段,反之称为不可重入的代码段

线程互斥

  • 互斥锁

  • atomic原子类型,一般利用CAS操作(无锁机制)实现,常见应用:无锁队列、链表、数组(使用活锁)

线程通信

条件变量 condition_variable

使用方法:mutex+condition_variable

waitsignal的交互状态关系:

在这里插入图片描述

问题:用notify_one还是notify_all? notify_one可能会死锁

  • 信号量 semaphore

可以用条件变量封装一个信号量

信号量可看作资源计数没有限制的互斥量:

mutex.lock() //锁的资源计数1 -》0

critical section

mutex.unlock()//锁的资源计数0 -》1

控制的精度不如条件变量

用于保证操作时序,而没有对资源的互斥访问

使用wait (-1)和 post(+1) 方法

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

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

相关文章

第二篇:强化学习中的7个基础概念

你好&#xff0c;我是zhenguo&#xff08;郭震&#xff09; 这是强化学习第二篇&#xff1a;强化学习7个基础概念 在强化学习中&#xff0c;智能体需要在不断尝试和错误的过程中学习&#xff0c;通过观察环境的反馈&#xff08;奖励或惩罚&#xff09;来调整自己的行为&#xf…

windows系统安装curl

下载安装包 https://curl.se/windows/ 2.如图所示&#xff0c;把下载的zip包解压到C盘某个目录下 把bin目录配置到系统环境变量Path里 在命令行里直接输入curl即可开始使用 5.curl测试访问百度 6.curl 测试ip端口连通性 用法&#xff1a;curl -v ip:port

推荐一款C端的低代码产品

目录 写在前面 低代码平台 平台怎么选 各平台区别 为什么选它 写在前面 大家都知道低代码这个叫法是从B端叫起来的&#xff0c;也就是说不管是业务人员还是开发人员&#xff0c;都是企业内部使用。那么有没有C端的&#xff0c;且免费使用的低代码产品呢&#xff1f; 低代码…

Matlab论文插图绘制模板第93期—带类别标签的散点图

在之前的文章中&#xff0c;分享了很多Matlab散点图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一种特殊的散点图&#xff1a;带类别标签的散点图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请…

数据库基础5-复合查询

文章目录 多表查询自连接子查询合并查询 基础查询中&#xff0c;再补充一个点&#xff1a; 在使用年薪进行降序排序中&#xff0c;我们有以下语句 //A: select ename, sal*12ifnull(comm,0) as 年薪 from emp order by 年薪 desc;查询到的结果&#xff1a; //B: select ename,…

Leetcode 剑指 Offer II 027. 回文链表

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个链表的 头节点 head &#xff0c;请判断其是否为回文链表…

ROS 开发环境搭建(虚拟机版本)(一)

相关工具&#xff0c;以及镜像&#xff08;以后有用&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1xgtp-XGFFNCACV_-0TJO2A 提取码&#xff1a;ar1w 1. 下载vm虚拟机&#xff08;我选择的官方最新的vm虚拟机&#xff09;&#xff0c;安装好 2.安装百度网盘里面的…

办公智慧化风起云涌,华为MateBook X Pro 2023是最短距离

今年以来&#xff0c;我们几乎每个月&#xff0c;甚至每星期都可以看到大模型应用&#xff0c;在办公场景下推陈出新。 办公智慧化已成必然&#xff0c;大量智力工作正在被自动化。一个普遍共识是&#xff1a;AI能力范围之内的职业岌岌可危&#xff0c;AI 能力范围之外的职业欣…

【TES710D】基于复旦微的FMQL10S400全国产化ARM核心模块

板卡概述 TES710D是一款基于上海复旦微电子FMQL10S400的全国产化核心模块。该核心模块将复旦微的FMQL10S400&#xff08;兼容FMQL20S400&#xff09;的最小系统集成在了一个50*70mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;特别是用…

第二章、认识用户体验五要素(本文作用是通俗讲解,让你更容易理解)

1.用户体验要素分五个层面&#xff0c;分别是战略层、范围层、结构层、框架层、表现层。 战略层&#xff1a;指的是产品所要解决的社会问题&#xff0c;和公司在这个产品上的收益目标。也就是大家所说的产品战略。 范围层&#xff1a;指的是我们要做的业务范围&#xff0c;我…

零基础学Java——基础part01

java基础第一篇 今日任务&#xff1a; 1、什么是软件开发 2、人机交互 3、常用的dos命令&#xff08;了解&#xff09; 4、什么是计算机语言 5、Java三种技术架构&#xff08;了解&#xff09; 6、Java语言特性&#xff08;跨平台原理) (了解&#xff09; 7、Java开发环境搭…

模拟运行600万年 数据0损坏!Solidigm把QLC闪存玩到了极致

不可否认的是&#xff0c;SLC、MLC、TLC、QLC、PLC、HLC……闪存技术一路走下来&#xff0c;整体的可靠性、寿命指标是逐步走低的&#xff0c;这也是NAND闪存架构天然属性所决定的。 当然&#xff0c;这不代表QLC、PLC闪存的就难堪大用&#xff0c;关键是看如何设计与优化&…

Carla自动驾驶仿真四:pygame渲染Camera画面及车辆控制(代码详解)

文章目录 前言一、依赖库安装1、pygame安装2、numpy安装 二、Pygame渲染Carla Camera画面1、连接Carla并初始化TrafficManager2、生成自动驾驶车辆并设置交通行为3、创建初始化pygame surface对象的函数4、创建pygame处理Carla图像的回调函数5、创建pygame键盘控制车辆运动的函…

软件设计师 试题二做题技巧

问题一&#xff1a;去需求分析中找相应的联系类型 问题二先看缺少的属性是不是er图中的实体&#xff0c;如果是实体文中就会有相关的信息&#xff0c;如果没有就对应的去图中找&#xff0c;转化为关系模式对应的联系也要转化为关系模式 如果是一对一就把联系归并到任意一方实…

JS 实现拖拽元素的功能

JS 实现拖拽元素的功能 这篇笔记比较短&#xff0c;主要过一遍 draggable 的事件。 首先简单看一下 HTML 实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Comp…

【小程序修改说明】分享朋友的,请忽略!

一、把js文件夹复制到根目录&#xff0c;跟pages同一目录 二、把下面的代码放到app.wxss最下面 代码 import "/js/font-awesome.wxss"; import "/js/font-awesome_small.wxss"; 三、ywym.wxml修改 1、ywym.wxml的最上边加上如下代码 <navigator url&…

【Linux】线程详解之线程控制

文章目录 POSIX线程库创建线程线程ID及进程地址空间布局线程等待pthread_join 线程终止pthread_exit函数pthread_cancel函数 线程分离理解pthread库 POSIX线程库 POSIX线程&#xff08;英语&#xff1a;POSIX Threads&#xff0c;常被缩写为Pthreads&#xff09;是POSIX的线程标…

若依源码解析:DataScopeAspect实现数据范围的控制

文章目录 源代码使用场景界面操作SysDeptServiceImplSysUserServiceImplSysUserMapperDataScope定义 代码解析Aspect和Component不同的数据权限类型Before通知处理数据范围的方法 源代码 Aspect Component public class DataScopeAspect {/*** 全部数据权限*/public static fi…

Python潮流周刊#2:Rust让Python再次伟大

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 这里记录每周值得分享的 Python 及通用技术内容&#xff0c;部分为英文&#xff0c;已在小标题注明。&#xff08;本期标题取自其中一则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。&#xff…