C++ 多线程知识汇总

https://zhuanlan.zhihu.com/p/194198073 (防链接失效)

程序使用并发的原因有两种:

  1. 为了关注点分离(程序中不同的功能,使用不同的线程去执行),当为了分离关注点而使用多线程时,设计线程的数量的依据,不再是依赖于 CPU 中的可用内核的数量,而是依据概念上的设计(依据功能的划分);
  2. 为了提高性能, 此时线程数量可以依据CPU的逻辑核心数目,这样可以使得每个线程能在不同的CPU核心上同时并发执行;

知道何时不使用并发与知道何时使用它一样重要。

不使用并发的唯一原因就是收益(性能的增幅)比不上成本(代码开发的脑力成本、时间成本,代码维护相关的额外成本)。运行越多的线程,操作系统需要为每个线程分配独立的栈空间,需要越多的上下文切换,这会消耗很多操作系统资源,如果在线程上的任务完成得很快,那么实际执行任务的时间要比启动线程的时间小很多,所以在某些时候,增加一个额外的线程实际上会降低,而非提高应用程序的整体性能,此时收益就比不上成本。而且多线程代码如果编写不当,运行中会出现很多问题,诸如执行结果不符合预期、程序崩溃等问题。

产生死锁的四个必要条件(面试考点):

  1. 互斥(资源同一时刻只能被一个进程使用)
  2. 请求并保持(进程在请资源时,不释放自己已经占有的资源)
  3. 不剥夺(进程已经获得的资源,在进程使用完前,不能强制剥夺)
  4. 循环等待(进程间形成环状的资源循环等待关系)

临界区速度最快,但只能作用于同一进程下不同线程,不能作用于不同进程;临界区可确保某一代码段同一时刻只被一个线程执行;

信号量多个线程同一时刻访问共享资源,进行线程的计数,确保同时访问资源的线程数目不超过上限,当访问数超过上限后,不发出信号量;

std::unique_lock 类似于 lock_guard,只是 std::unique_lock 用法更加丰富,同时支持 std::lock_guard() 的原有功能。 使用 std::lock_guard 后不能手动l ock() 与手动 unlock(),使用 std::unique_lock 后可以手动 lock() 与手动 unlock(); std::unique_lock 的第二个参数,除了可以是 adopt_lock,还可以是try_to_lock 与 defer_lock;

try_to_lock: 尝试去锁定,得保证锁处于 unlock 的状态,然后尝试现在能不能获得锁;尝试用 mutx 的 lock() 去锁定这个 mutex,但如果没有锁定成功,会立即返回,不会阻塞在那里,并继续往下执行;

defer_lock: 始化了一个没有加锁的 mutex;

std::condition_variable 是 C++ 中用于线程间同步的一个重要工具,可以让一个线程在某个条件不满足时等待,直到另一个线程通知它。

#include <iostream>
#include <thread>
#include <condition_variable>
#include <queue>
#include <atomic>std::mutex mtx; // 互斥量
std::condition_variable cv; // 条件变量
std::queue<int> dataQueue; // 共享数据队列
std::atomic<bool> done(false); // 指示生产者是否完成void producer() {for (int i = 0; i < 10; ++i) {std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产延迟{std::lock_guard<std::mutex> lock(mtx); // 锁定互斥量dataQueue.push(i); // 生产数据std::cout << "Produced: " << i << std::endl;}cv.notify_one(); // 通知一个等待的线程}done = true; // 标记生产结束cv.notify_all(); // 通知所有等待的线程
}void consumer() {while (true) {std::unique_lock<std::mutex> lock(mtx); // 锁定互斥量cv.wait(lock, [] { return !dataQueue.empty() || done; }); // 等待条件变量if (dataQueue.empty() && done) {break; // 如果没有数据且生产已完成,退出循环}int data = dataQueue.front(); // 访问共享资源dataQueue.pop();std::cout << "Consumed: " << data << std::endl;}
}int main() {std::thread prod(producer); // 启动生产者线程std::thread cons(consumer); // 启动消费者线程prod.join(); // 等待生产者线程结束cons.join(); // 等待消费者线程结束return 0;
}

为了减少创建与销毁线程所带来的时间消耗与资源消耗,因此采用线程池的策略:

程序启动后,预先创建一定数量的线程放入空闲队列中,这些线程都是处于阻塞状态,基本不消耗 CPU,只占用较小的内存空间。

接收到任务后,任务被挂在任务队列,线程池选择一个空闲线程来执行此任务。

任务执行完毕后,不销毁线程,线程继续保持在池中等待下一次的任务。

线程池所解决的问题:

(1) 需要频繁创建与销毁大量线程的情况下,由于线程预先就创建好了,接到任务就能马上从线程池中调用线程来处理任务,减少了创建与销毁线程带来的时间开销和CPU资源占用。

(2) 需要并发的任务很多时候,无法为每个任务指定一个线程(线程不够分),使用线程池可以将提交的任务挂在任务队列上,等到池中有空闲线程时就可以为该任务指定线程。

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

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

相关文章

用Python实现时间序列模型实战——Day 28-29: 项目报告与展示

一、学习内容 1.1 项目报告的撰写与优化 项目报告应该从项目背景、数据探索、建模过程、预测结果、模型评估等方面进行全面描述。通过清晰的图表、简明的文字和合理的模型选择来优化报告的表达。 1.2 项目结果的展示与交流 通过展示图表、代码、关键模型的结果&#xff0c;…

Linux系统中的进程调度队列

目录 一、进程调度队列结构 二、活动队列与过期队列 1.queue[140] 2.bitmap[5] 一、进程调度队列结构 Linux系统中&#xff0c;每一个CPU都有一个进程调度队列runqueue&#xff0c;如图所示 二、活动队列与过期队列 运行队列runqueue中有两个指针*active、*expired。*acti…

从小白到大神:C语言预处理与编译环境的完美指南(下)

从小白到大神&#xff1a;C语言预处理与编译环境的完美指南&#xff08;上&#xff09;-CSDN博客 &#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;上篇链接在这~~&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x…

角色权限管理实现学习

逻辑&#xff1a; 权限表(Sys_Power):存所需授权才能访问的检验字段 授权表/角色权限表(Sys_RolePower):存角色所能访问的权限字段 角色表(Sys_Role)&#xff1a;定义角色(管理员&#xff0c;部门负责人&#xff0c;项目负责人...) 用唯一的权限字段标注所要授权才能访问的…

心理辅导系统设计与Spring Boot技术

5 系统的实现 5.1学生功能模块的实现 学生进入本系统可查看系统信息&#xff0c;系统主界面展示如图5-1所示。 图5-1系统主界面图 5.1.1 学生登录界面 学生在登录时需输入正确的登录用户名和密码&#xff0c;系统会以登录用户名、密码为参数进行登录信息的验证&#xff0c;信…

Keil MDK5学习记录

2024.9.19 1. no browse information available in ‘xxx’的问题 成功解决Keil MDK5中no browse information available in ‘xxx’的问题-CSDN博客https://blog.csdn.net/bean_business/article/details/1091894452. .c文件中显示函数列表 如何在Keil5里.c文件中显示函数列表…

oracle数据库启动

文章目录 背景一、步骤1.登录oracle用户2.启动监听服务3.启动数据库 背景 oracle数据库启动 一、步骤 1.登录oracle用户 代码如下&#xff08;示例&#xff09;&#xff1a; su - oracle2.启动监听服务 代码如下&#xff08;示例&#xff09;&#xff1a; lsnrctl start成…

AI音乐创作带给音乐原创人的挑战和机遇

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;AI音乐创作在全球音乐产业中逐渐崭露头角。人工智能不仅能生成旋律、和声&#xff0c;甚至可以模仿艺术家风格创作出接近真实人类创作的作品。这一技术的崛起给音乐原创人带来了前所未有的挑战&#xff0c;但…

【PyQt5】QWidget子类所有子类

QWidget子类 [QObject 学习](https://editor.csdn.net/md/?articleId142371795) 2024-09-19更新QWidget子类所有子类 2024-09-17发布子类QAbstractButton类 2024-09-17正在学习中QAbstractslider类QAbstractSpinBox类QFrame类QCalendarwidget类QComboBox类QDialogButtonBox类Q…

【计算机网络 - 基础问题】每日 3 题(十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

uniapp 微信小程序 订阅消息功能实现

该网址 https://api.weixin.qq.com 上线后不可访问&#xff0c;调用该网址操作需在后端&#xff08; 重要&#xff01; 重要&#xff01; 重要&#xff01;&#xff09; 1.首先拿到的三个码 //微信公众平台 //https://mp.weixin.qq.com const wxappid "管理-开发管理-A…

QTCreator 调试:unknown debugger type “No engine“

QTCreator 调试&#xff1a;unknown debugger type "No engine" - kaizenly - 博客园 (cnblogs.com) 一开始Debuggers---Auto-detected这里第一row第一个项是标红的&#xff0c;然后没改东西&#xff0c;点完应用Apply以后&#xff0c;就可以调试了...&#xff08;不…

Spring Boot助力高校心理辅导系统升级

3 系统分析 3.1可行性分析 在进行可行性分析时&#xff0c;我们通常根据软件工程里方法&#xff0c;通过四个方面来进行分析&#xff0c;分别是技术、经济、操作和法律可行性。因此&#xff0c;在基于对目标系统的基本调查和研究后&#xff0c;对提出的基本方案进行可行性分析。…

【华为杯】2024华为杯数模研赛E题 解题思路

题目 高速公路应急车道紧急启用模型 问题背景 高速公路拥堵现象的原因众多&#xff0c;除了交通事故外&#xff0c;最典型的就是部分路段出现瓶颈现象&#xff0c;主要原因是车辆汇聚&#xff0c;而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点&#xff0c;如匝道…

(done) 什么是 GMM? Gaussian Mixture Model,高斯混合模型

来源&#xff1a;https://www.bilibili.com/video/BV13b411w7Xj/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 &#xff08;视频质量很高&#xff0c;一共四个视频&#xff0c;我只看了一个&#xff09; 直接看视频吧&#xff0…

2024年度性价比高的头戴式耳机怎么选?TOP4爆款产品推荐,速藏!

在 2024 年&#xff0c;头戴式耳机市场精彩纷呈&#xff0c;众多产品让人眼花缭乱。想要选到性价比高的头戴式耳机&#xff0c;需综合考量音质、降噪、续航等多个关键要素。2024年度性价比高的头戴式耳机怎么选&#xff1f;接下来为大家推荐四款爆款产品&#xff0c;让你快速了…

应届生必看 | 毕业第一份工作干销售好不好?

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

基础漏洞——SSRF

目录 一.原理 二.引起ssrf的函数 三.这些函数具体作用 &#xff08;1&#xff09;File_get_content() &#xff08;2&#xff09;Fsockopen() &#xff08;3&#xff09;Curl_exec() 四.常见的业务场景&#xff08;可能出现的漏洞的地方&#xff0c;漏洞挖掘&#xff09…

为什么消费还能返利?2024年全新返利模型!

在当今竞争激烈的电商市场中&#xff0c;一种名为“循环购”的创新商业模式正悄然兴起&#xff0c;以其独特的消费返利机制和积分体系&#xff0c;为消费者带来了前所未有的购物体验 一、循环购模式&#xff1a;消费即投资的智慧选择 循环购模式并非简单的消费行为&#xff0c…

无人机集群路径规划:麻雀搜索算法(Sparrow Search Algorithm, SSA)​求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化…