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

项目介绍

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

第一版线程池任务对象使用继承技术,提供一个抽象基类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) 方法

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

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

相关文章

c++综合学习

1.函数调用 传值调用&#xff1a;在函数内部修改形式参数&#xff0c;不改编实际参数的值&#xff1b;引用调用&#xff1a;即指针调用&#xff0c;传入的是变量的指针&#xff0c;则在函数内部修改形式参数&#xff0c;实际参数跟着改变。 2. 数组 数组名即该数组的首地址&a…

CSPM 未来发展的思考

由于数据泄露的持续威胁以及云的短暂和快节奏的特性&#xff0c;只有在最基础的层面上保护您的云才有意义。组织已经转向 CSPM 解决方案来锁定他们的平台。 今天我们来聊聊什么是CSPM&#xff0c;它如何去产生有有效的帮助&#xff0c;未来会向哪发展。 什么是 CSPM&#xff1…

阿拉德手游服务端Centos搭建教程

阿拉德手游服务端Centos搭建教程 大家好我是艾西&#xff0c;又有几天没有更新文章了。这几天看了看还是有不少人对手游感兴趣&#xff0c;今天给大家分享一款早些年大火的pc游戏&#xff0c;现在也有手游了“阿拉德”。 你是否还记得DNF&#xff0c;一天你不小心救了赛丽亚&a…

Win10系统电脑开机黑屏一直转圈无法进入桌面怎么办?

Win10系统电脑开机黑屏一直转圈无法进入桌面怎么办&#xff1f;有用户电脑开机了之后无法进入到桌面中&#xff0c;开机了之后&#xff0c;电脑桌面只有显示一个黑屏和转圈的图标&#xff0c;一直都无法进入到桌面中。强制重启电脑之后依然是这样&#xff0c;那么这个情况怎么去…

今天公司来了个拿 30K 出来的测试,算是见识到了基础的天花板

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是上家公司离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的…

Mysql-存储过程简单入门

定义&#xff1a; 存储过程的英文是 Stored Procedure 。它的思想很简单&#xff0c;就是一组经过 预先编译 的 SQL 语句 的封装。 执行过程&#xff1a;存储过程预先存储在 MySQL 服务器上&#xff0c;需要执行的时候&#xff0c;客户端只需要向服务器端发出调用 存储过程的命…

Godot引擎 4.0 文档 - 循序渐进教程 - 监听玩家输入

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Listening to player input — Godot Engine (stable) documentation in English 监听玩家输入 在上一课创建您的第一个脚本的基础上&#xff0c;让我们看看任何游戏…

SpringBoot集成SpringSecurity从0到1搭建权限管理详细过程(认证+授权)

前言 最近工作需要给一个老系统搭建一套权限管理&#xff0c;选用的安全框架是SpringSecurity&#xff0c;基本上是结合业务从0到1搭建了一套权限管理&#xff0c;然后想着可以将一些核心逻辑抽取出来写一个权限通用Demo&#xff0c;特此记录下。 文章目录 前言1、SpringSecuri…

Elastic Stack

一、简介 ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;官网https://www.elastic.co/cn。包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和收集的场景&#…

接口测试:Eolink Apikit 和 Postman 哪个更好用?

接口测试&#xff1a;Eolink Apikit 和 Postman 哪个更好用&#xff1f; 很多做服务端开发的同学&#xff0c;应该基本都用过 Postman 来测试接口&#xff0c;虽然 Postman 能支撑日常工作&#xff0c;但是总感觉还是少了点什么&#xff0c;比如需要 Swagger 来维护接口文档&am…

nginx压测记录

nginx压测记录 1 概述2 原理3 环境3.1 设备与部署3.2 nginx配置/服务器配置 4 netty服务5 步骤6 结果7 写在最后 1 概述 都说nginx的负载均衡能力很强&#xff0c;最近出于好奇对nginx的实际并发能力进行了简单的测试&#xff0c;主要测试了TCP/IP层的长链接负载均衡 2 原理 …

YOLOv5区域检测+声音警报

YOLOv5区域检测声音警报 1. 相关配置2. 检测区域设置3. 画检测区域线&#xff08;不想显示也可以不画&#xff09;4. 报警模块5. 代码修改5.1 主代码5.2 细节修改&#xff08;可忽略&#xff09; 6. 实验效果 本篇博文工程源码下载 链接1&#xff1a;https://github.com/up-up-…

远程桌面连接工具在哪里下载?

在市场上&#xff0c;有很多种不同的工具可用。一些远程桌面连接工具&#xff08;如RayLink&#xff09;具有高清流畅、操作简单和连接速度快的特点。而其他一些连接工具则更注重保护安全和数据保密性。不同的远程桌面连接工具各有特点&#xff0c;需要根据不同的需求进行选择。…

[AI图片生成]自己搭建StableDiffusion安装过程

前言 最近尝试玩玩AI图片生成,安装一路坑 出个一路安装成功的记录 开始 找个空间大的盘符,这玩意将来会很占空间.一个模型大约5g左右,你可能还会装很多模型创建个目录,路径不要有中文安装git 下载地址 详细教程 (如果有忽略)下载 Python3.10.0,记得勾选添加到环境变量选项,安…

ChatGPT帮你写简历找工作

随着随着毕业时间的到来&#xff0c;应届生将要面临求职问题&#xff0c;根据官方的统计&#xff0c;2023届高校毕业生预计达1158万人&#xff0c;就业市场竞争激烈&#xff0c;无论是校园招聘&#xff0c;招聘会&#xff0c;线上招聘除了自身的准备和个人能力&#xff0c;都会…

2023 hnust 大三下 人工智能导论课程 期中考试复习笔记

前言 ★大概率考✦个人推测考点※补充内容没有完全覆盖“人工智能导论复习2023.pdf”的重点致谢&#xff1a;hwl、lyf、lqx 题型 问答&#xff1a;5*10分综合&#xff1a;15分设计&#xff1a;25分开放题/论述题&#xff1a;10分 第1章 绪论 人工智能的定义 智能 思考与…

Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现

开发背景 好多开发者可能疑惑&#xff0c;外部数据实时预览播放&#xff0c;到底有什么用&#xff1f; 是的&#xff0c;一般场景是用不到的&#xff0c;我们在开发这块前几年已经开发了非常稳定的RTMP、RTSP直播播放模块&#xff0c;不过也遇到这样的场景&#xff0c;部分设…

MySQL和Redis如何保证数据一致性?

前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用&#xff0c;在读取缓存这方面基本都是一致的&#xff0c;大概都是按照下图的流程进行操作&#xff1a; 但是在更新缓存方面&#xff0c;是更新完数据库再更新缓存还是直接删除缓存呢&#xff1f;又或者是先删除缓存再…

ATTCK v13版本战术介绍——防御规避(六)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第31-36种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…

Revit幕墙:这些命令在幕墙嵌板中的妙用及快速幕墙

一、Revit中这些命令在幕墙嵌板中的妙用 在我们做幕墙时&#xff0c;通常会有不同种类的幕墙&#xff0c;比如材质不同&#xff0c;颜色不同。这时我们就需要去选中嵌板进行替换新样式的嵌板。 1.通常我们在替换嵌板时都是通过Tab切换&#xff0c;然后选中嵌板。这样进行来回切…