【C++】多线程编程一(初识并发和多线程)

news2025/1/11 18:35:02

目录

一、并发和并行的概念

1.并发

2.并行

3.并发和并行的区别

二、并发的途径

多进程并发

多线程并发

 三、C++11相关多线程编程的头文件


一、并发和并行的概念

1.并发

 并发:指同一时刻只能有一条指令执行,但是多个进程指令被快速地轮换执行,使得在宏观上具有多个进程同时执行的效果,但实际在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。

2.并行

并行:指同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观看,都是同时执行。

3.并发和并行的区别

解释一:并行是两个或多个事件在同一时刻发生;并发是指两个或多个事件在同一时间间隔发生。

解释二:并行是在不同实体上的多个事件;并发是在同一实体上的多个事件。

解释三:并行是在多台处理器上同时处理多个任务;并发是在一台处理器上同时处理多个任务。

并发编程目标就是充分地利用处理器地每一个核,以达到最高地处理性能。


二、并发的途径

  • 多进程并发

多进程并发是将应用程序分为多个独立的进程,它们在同一时刻运行(例如:同时进行网页浏览和文字处理)。独立的进程可以通过进程间常规通信渠道进行信息交换(信号、套接字、文件、管道等)。进程间的通信比较简单,但是速度慢,因为操作系统会在进程间提供一定的保护措施,以避免一个进程去修改另一个进程的数据(这些保护操作意味着可以编写更安全的并发代码)。运行多个进程需要时空开销:启动进程需要时间,操作系统内部资源来管理进程。

多进程并发的独特优势——可以使用远程连接,在不同的机器上运行独立的进程。

  • 多线程并发

多线程并发是在单个进程中运行多个线程。每个线程相互独立运行,且线程可以在不同的指令序列中运行。进程中的所有线程都共享地址空间,并且所有线程访问到的大部分数据——全局变量仍然是全局的,指针、对象的引用或数据可以在线程间传递。进程间通常共享内存,但是这种共享通常难以建立和管理。因为同一数据的内存地址在不同的进程中是不同的。

 多线程地址空间共享,缺少线程间数据的保护,使得操作系统的记录工作量减少,所有多线程的开销要远小于使用多进程。共享内存的使用同时也带来了线程安全问题:如果数据要被多个线程访问,必须确保每个线程所访问的数据的一致性。

注意:线程的资源是有限的。如果太多的线程同时运行,会消耗很多的操作系统资源,从而使得操作系统整体运行得更加缓慢。而且每个线程多需要一个独立的堆栈空间,所以运行太多的线程会耗尽进程的可用内存或地址空间。

通过一个案例来解释多进程和多线程并发:

当两个程序员在两个独立的办公室一起做一个软件项目,他们可以安静地工作、不互相干扰,并且他们人手一套参考手册。但是,他们沟通起来就有些困难,他们必须使用电话、电子邮件或到对方的办公室进行直接交流。并且,管理两个办公室需要有一定的经费支出,还需要购买多份参考手册。

假设,让开发人员同在一间办公室办公,他们可以自由的对某个应用程序设计进行讨论,也可以在纸或白板上轻易的绘制图表,对设计观点进行辅助性阐释。现在,你只需要管理一个办公室,只要有一套参考资料就够了。遗憾的是,开发人员可能难以集中注意力,并且还可能存在资源共享的问题(比如,“参考手册哪去了?”)

以上两种方法,描绘了并发的两种基本途径。每个开发人员代表一个线程,每个办公室代表一个进程。第一种途径是每个进程只要一个线程,这就类似让每个开发人员拥有自己的办公室,而第二种途径是每个进程有多个线程,如同一个办公室里有两个开发人员。


 三、C++11相关多线程编程的头文件

C++11 新标准中引入了五个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>

  • <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。
  • <thread>:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。
  • <mutex>:该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard, std::unique_lock, 以及其他的类型和函数。
  • <condition_variable>:该头文件主要声明了与条件变量相关的类,包括 std::condition_variable 和 std::condition_variable_any。
  • <future>:该头文件主要声明了 std::promise, std::package_task 两个 Provider 类,以及 std::future 和 std::shared_future 两个 Future 类,另外还有一些与之相关的类型和函数,std::async() 函数就声明在此头文件中。

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

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

相关文章

C语言--文件操作

文章目录 前言文件文件名 文件的打开和关闭文件指针文件的打开和关闭 文件的顺序读写fgetc、fputcfgets、fputsfprintf、fsanffread、fwrite 文件的随机读写fseekftellrewind 文本文件和二进制文件文件读取结束的判定feof 文件缓冲区 前言 在我们写完一个程序之后&#xff0c;…

【数据结构】树二叉树的概念以及堆的详解

⭐️ 往期相关文章 ✨链接1&#xff1a;【数据结构】顺序表 ✨链接2&#xff1a;【数据结构】单链表 ✨链接3&#xff1a;【数据结构】双向带头循环链表 ✨链接4&#xff1a;【数据结构】栈和队列 ⭐️ 树的概念 百度百科的解释&#xff1a;树是一种非线性的数据结构&#xf…

Jmeter四种关联方法讲解

目录 方法一&#xff0c;从前一个请求中取&#xff0c;用正则表达式提取器。 二、json path extractor 三、json extractor 四、XPath Extractor 方法一&#xff0c;从前一个请求中取&#xff0c;用正则表达式提取器。 具体方法&#xff0c;在需要获得数据的请求上右击添加…

【09】STM32·HAL库-新建HAL库版本MDK工程 | 下载STM32固件库

目录 1&#xff0c;新建工程前的准备工作&#xff08;了解&#xff09;1.1下载相关STM32Cube 官方固件包&#xff08;F1/F4/F7/H7&#xff09; 2&#xff0c;新建HAL库版本MDK工程步骤&#xff08;熟悉&#xff09;2.1新建工程文件夹2.1.1Drivers文件夹2.1.2Middlewares文件夹2…

基数排序(Radix_Sort)

基数排序 (Radix Sort)-20230715 前言 基数排序适用于多关键字排序&#xff0c;与前述的比较排序不同&#xff0c;实现基数排序不需要对关键字进行比较和移动。简而言之&#xff0c;基数排序是一类借助多关键字排序的思想对单逻辑关键字实现排序的方法。 多关键字排序 先看…

SwiftUI 原生或利用 Vision 检测限定高度的 Text 视图能否完整显示文本的方法

功能需求 在 SwiftUI 开发中,为了节省空间我们往往会为内容很长的文本视图(Text)限定一个高度,然后让用户决定是否展开显示其完整内容。 如上图所示,为了节省空间我们对 Text 视图高度做了限制,然后根据文本长度自动显示或隐藏展开按钮,用户点击该按钮即可展开显示完整…

FL Studio21入门版编曲 2023年免费小白新手编曲工具

全能数字音乐工作站&#xff08;DAW&#xff09;编曲、剪辑、录音、混音&#xff0c;有了它就能把你的笔记本电脑变成全功能音乐工作室。 内置丰富插件&#xff0c;满足不同风格创作拥有强大的采样引擎&#xff0c;自带高品质打击乐、钢琴、弦乐、吉他等107种乐器效果。 流行…

C++-把字符串转换成整数

题目来源&#xff1a;牛客网 题目描述&#xff1a; 将一个字符串转换成一个整数&#xff0c;要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0 数据范围&#xff1a;字符串长度满足 0≤n≤100 进阶&#xff1a;空间复杂度 O(1) O(1) &…

Mybatis执行SQL过程

文章目录 1. 相关代码2. 创建SqlSession3. 创建Mapper代理对象4.sql的执行4.1 MapperProxy.invoke()4.2 mapperMethod.execute()4.3 sqlSession.selectOne4.4 CachingExecutor.query()4.5 BaseExecutor.query方法4.6 SimpleExecutor.doQuery方法 1. 相关代码 Testpublic void …

其他形式转欧拉角形式

1. 坐标系轴方向问题 3D数学基础中约定使用左手坐标系 左手坐标系 右手坐标系 左手正方向&#xff1a;x正向右平移&#xff0c;y向上平移&#xff0c;z向前平移. 右手正方向&#xff1a;x正向左平移&#xff0…

漫谈大数据时代的个人信息安全(二)——“逢脸造戏”

大数据时代的个人信息安全系列二&#xff1a;“逢脸造戏” 1. 逢脸造戏2. 生物识别信息安全2.1 生物识别信息被大量获取2.2 生物识别信息被非法滥用 3. 各国加强对深度合成监管4. 个人信息保护小贴士 互联网就像公路&#xff0c;用户使用它&#xff0c;就会留下脚印。 每个人都…

文件IO_复制文件描述符(附Linux-5.15.10内核源码分析)

目录 1.文件描述符复制简介 2.dup函数原型 2.1 dup函数 2.2 dup函数工作原理 2.3 dup函数内核源码分析 2.4 dup函数示例代码 3.dup2函数原型 3.1 dup2函数 3.2 dup2函数工作原理 3.3 dup2函数内核源码分析 3.4 dup2函数示例代码 4.dup3函数原型 4.1 dup3函数 4.2…

rv1126人脸识别的相关操作

目录 一、代码的改写Makeflierkmedia_rockx_face_insert.cpprkmedia_rockx_face_rga_rtsp_main.cpprkmedia_rockx_face_two_rkisp_rtsp_main.cppsqlite3_operation.cpp二、在ubuntu上交叉编译三、板子上的相关操作一、代码的改写 Makeflie 修改交叉编译工具链 rkmedia_rockx_fa…

2023年NOC决赛-加码未来编程赛项决赛模拟题-Python模拟题--卷5

第一题 题目:输入一个整数n,计算其各位上数字之和,并用汉语写出每一位数字并输出。 【输入格式】一个整数 【输出格式】再一行内输出数字之和的每一位对应的汉字 【输入样例】1234 【输出样例】一零 第二题 题目:小溪使用 Excel 将任意 2 组数字中相同的数按照从小到…

终于有人把软件测试用例讲清楚了(一定要收藏)

目录 1&#xff1a;公司流程 1.1. 测试用例的4个特性 1.1. 测试用例通常包括以下几个组成元素&#xff1a; 1. 编写测试用例的基本方法 1.1.1. 概念 1.1.1. 示例 1.1练习案例: 1.1. 边界值法 1.1.1. 确定边界值的方法&#xff08;&#xff09; 1.1. 因果图法 1.1.1.…

keil5软件仿真stm32设置 和 调试技巧

keil5软件仿真stm32设置 和 调试技巧 文章目录 keil5软件仿真stm32设置 和 调试技巧前言一、设置二、调试1.串口显示 总结 前言 不想用板子的时候或没有板子的时候&#xff0c;软件仿真更方便调试快速验证&#xff1b; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

LeetCode 周赛上分之旅 #33 摩尔投票派上用场

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难…

【简单认识MySQL数据库存储引擎】

文章目录 一、存储引擎概念介绍二、MyISAM存储引擎1.特点详解2.适用生产环境 三、InnoDB存储引擎1.特点详解2.适用生产环境 四、数据库存储引擎操作1.查看数据库支持的存储引擎2.查看数据库存储引擎3.修改数据库表的存储引擎 五、行锁和表锁1.InnoDB使用行锁和表锁的场景2.行锁…

Flink复习笔记

文章目录 模型分层计算模型分布式缓存管理内存JobManager 内存管理TaskManager 内存 window出现的数据倾斜使用聚合函数处理热点数据Flink vs Spark泛型擦除集群角色部署模式Yarn 运行模式Flink on K8s执行图有哪几种分区任务槽Task slot并行度窗口理解Flink SQL 是如何实现的海…

springCloudAlibaba之dubbo替换openFeign

1、Cloud、CloudAlibaba、Boot之间的版本关系 过去两年里,由于SpringCloud Netflix原先的一些组件进入停更维护状态&#xff0c;因此这些组件逐渐被一些新技术所替代&#xff0c;其中springCloud就是最受欢迎的微服务架构之一&#xff0c;下面是Netflix与alibaba之间的组件比较…