【C++并发编程01】初识C++并发编程

article/2025/7/5 17:53:34

1、并发是什么
并发是指两个或更多独立的活动同时发生,现实生活中常见的并发场景如边吃饭边看手机。

1.1、计算机中的并发:
计算机领域的并发是指在单个系统里同时执行多个独立的任务,而非顺序的进行一些活动。
我们在电脑上能够边听音乐边和其他人在网上聊天就是使用了计算机的并发功能,这也叫计算机的分时系统,使用的是时间切片的技术。
时间切片能通过操作系统将CPU时间划分为多个很小的时间段(通常为毫秒级),每个时间段称为一个时间片。系统按照一定的调度算法,将时间片轮流分配给各个就绪状态的进程。实现多个用户终端同时使用一台计算机资源。

1.2、单核计算机的并发假象:
单核计算机只有一个处理器,只能在某一时刻执行一个任务,不过他可以每秒钟进行多次任务切换。通过“这个任务做一会,再切换到别的任务,再做一会”的方式,让任务看起来是并行执行的。
每次任务切换都需要切换一次上下文,为当前运行的任务保存cpu的状态和指令指针,并计算出要切换到哪个任务,并未即将切换到的任务重新加载处理器装填。任务切换过程需要时间开销。

1.3、多核计算机并发:
单芯多核处理器,能够真正的并行执行多个任务,也称为“硬件并发”。
在这里插入图片描述

两个任务在单核处理和双核处理器中的执行情况

1.4、并发的两种途径
a、多进程并发:
将应用程序分为多个独立的进程,他们在同一时刻运行,就像同时进行网页浏览和文字处理一样。进程与进程之间通过ipc通信。
[图片]

b、多线程并发:
在单个进程中运行多个线程,进程中的所有线程都共享地址空间,当一个数据被多个线程同时访问时,需要确保数据的一致性。
在这里插入图片描述

2、使用并发的原因
使用并发的主要原因有两个:关注点分离和性能考虑
2.1、关注点分离
通过将相关代码与无关代码分离,可以使程序更容易理解和测试,从而减少出错的可能性。
若不显示地使用并发,就的编写一个任务切换框架,让程序代码逻辑更复杂。
2.2、为了性能
在单个芯片上集成多个处理器,当并行运行多个任务时可以获取更好的性能。

  • 任务并行:将单个任务拆分成几部分,且各自运行裕兴,从而降低总运行时间。
  • 数据并行:每个线程在不同的额数据部分上执行相同的操作。实现在相同的时间内处理了更多的数据。

2.3、不使用并发的场景:
不使用并发的唯一原因就是收益比不上成本。一般考虑如下几点原因:
1)使用并发的代码会增加代码的复杂性,在很多情况下难以理解,增加脑力成本。
2)线程启动存在固有的开销,将新线程加入到调度器中,需要一定的时间。且让太多的线程同时运行,会消耗很多操作系统资源,因为每个线程都需要独立的堆栈空间,最后让操作系统运行得更加缓慢。
3)多线程运行时,需要做更多的上下文切换,都需要消耗cpu运行时间。

3、使用thread实现并发编程

#include <iostream>
#include <thread> //①
void hello() //②
{std::cout << "Hello Concurrent World\n";
}int main()
{std::thread t(hello); //③t.join(); //④
}

1)要使用C++多线程,需要引入函数库
2)每个线程执行都需要有一个初始函数,新线程的执行在这里开始。主线程的开始函数是main
3)初始化线程thread t,将线程初始函数hello作为参数传入
4)线程thread调用join方法,会导致调用线程(main线程)等待线程t执行完成,才会继续往下执行,否则主线程自顾自执行并结束。


http://www.hkcw.cn/article/rUAmSVcmsT.shtml

相关文章

【NLP入门系列一】NLP概述和独热编码

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​&#xff1b;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒…

【知识点】第2章:Python程序实例解析

文章目录 知识点整理Python程序语法元素分析 练习题判断题填空题选择题 知识点整理 Python程序语法元素分析 Python程序包括格式框架、注释、变量、表达式、分支语句、循环语句、函数等语法元素。 程序的格式框架 Python语言采用严格的 “缩进” 来表明程序的格式框架。缩进…

Webug4.0靶场通关笔记05- 第5关SQL注入之过滤关键字

目录 一、代码审计 1、源码分析 2、SQL注入分析 &#xff08;1&#xff09;大小写绕过 &#xff08;2&#xff09;双写绕过 二、第05关 过滤型注入 1、进入靶场 2、sqlmap渗透 &#xff08;1&#xff09;bp抓包保存报文 &#xff08;2&#xff09;sqlmap渗透 &…

001在线拍卖系统技术揭秘:构建高效交互的竞拍平台

在线拍卖系统技术揭秘&#xff1a;构建高效交互的竞拍平台 在互联网经济蓬勃发展的当下&#xff0c;在线拍卖系统以其独特的交易模式&#xff0c;吸引着众多用户参与。该系统涵盖个人中心、用户管理等多个关键模块&#xff0c;通过前台展示与后台录入的协同运作&#xff0c;满…

LabVIEW输血袋字符智能检测系统

针对医疗行业输血袋字符检测需求&#xff0c;基于 LabVIEW 图形化开发平台与基恩士&#xff08;KEYENCE&#xff09;机器视觉硬件&#xff0c;构建高精度、高可靠性的字符在线识别系统。通过选用基恩士工业相机、光源及 NI 数据采集设备等硬件&#xff0c;结合 LabVIEW 强大的图…

Conditional注解的使用

目录 1.ConditionalOnBean 1.1、作用 1.2、使用场景 2. ConditionalOnMissingBean 2.1、作用 2.2、使用场景 3. 两者结合使用 4. 高级用法&#xff1a; 5. 注意事项 6. 实际应用场景 前言 在 Spring 框架中&#xff0c;ConditionalOnBean 和 ConditionalOnMissingBea…

CTFshow web3

文件包含和伪协议 用GET传入一个URL值&#xff0c;/?url文件路径 伪协议php://input 用来执行PHP代码&#xff0c;将POST请求当作PHP代码执行 测试一下&#xff0c;可以正确解析 拿到FLAG 还有一种解法&#xff0c;写入一句话木马 #Payload #把一句话木马写入2.phpdata:/…

数据库暴露--Get型注入攻击

1.背景知识 1.1Post、Get的对比 特性GET 方法POST 方法HTTP 方法类型GETPOST数据位置URL 查询字符串(?key=value)请求体(Request Body)数据可见性明文显示在 URL 和浏览器历史中不可见(除非开发者工具查看)数据长度限制受 URL 长度限制(通常约 2048 字符)无明确限制(…

Linux 1.0.4

父子shell linux研究的就是shell 打开两个窗口就是两个shell 终端的软件有很多 bash也是一个软件 我们在terminal里面再打开一个bash&#xff0c;然后再次使用ps命令发现多出来一个bash&#xff0c;之后点击exit只是显示了一个exit&#xff0c;这个只是退出了在terminal中打开…

挖洞日记 | 记一次MSSQL注入绕waf过程

在挖漏洞时&#xff0c;使用 xia sql 插件发现一个注入点&#xff0c;经过测试发现存在 waf 拦截记录一下。 在查询中发现单引号是空白页面&#xff0c;在加一个单引号&#xff0c;显示空数据&#xff0c;但是有回显&#xff0c;初步判断 pname 存在 SQL注入。 然后判断列数1o…

Linux-pcie ranges介绍

参考链接&#xff1a;https://elinux.org/Device_Tree_Usage#PCI_Host_Bridge pcie bar高低端BAR起始地址介绍 pcie设备树节点 / {compatible "rockchip,rk3588";interrupt-parent <&gic>;#address-cells <2>;#size-cells <2>;pcie3x4: p…

模块化设计,static和extern(面试题常见)

文章目录 一、函数的声明和定义1.1 单个文件1.2 多个文件1.3 static和extern1.3.1 static修饰局部变量1.3.2 static修饰全局变量1.3.3 static修饰函数 总结 一、函数的声明和定义 1.1 单个文件 一般我们在使用函数的时候&#xff0c;直接将函数写出来就使用了 题目:写一个函数…

探讨下LLM 在逻辑推理中的记忆现象

简述 今天刷到一篇推理模型训练的论文&#xff0c;研究解答了我们使用大模型的人困惑&#xff0c;大模型的能力到底是弈中高级的匹配模式还是真的在做逻辑推理 [2410.23123] On Memorization of Large Language Models in Logical ReasoningAbstract page for arXiv paper 24…

deepseekR1模型:Win11本地部署(ollam+DS:8b+chatbox AI)

目录 一、部署工具包二、Ollama安装1. 修改Ollama模型路径&#xff08;不需要修改安装路径可忽略此部分&#xff09;1.1 模型路径原配置1.2 更改模型路径原配置&#xff0c;释放C盘压力 2. 安装Ollama2.1 下载Ollama安装包2.1 安装验证 三、安装大模型&#xff08;博主安装DS-r…

leetcode:7. 整数反转(python3解法,数学相关算法题)

难度&#xff1a;中等 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例…

ROS 2 中的 robot_state_publisher 和 joint_state_publisher 详解

文章目录 总体简介&#x1f9e9; 1 . joint_state_publisher - 关节状态发布器&#x1f4cc; 核心功能⚙️ 工作原理&#x1f9e0; 主要任务&#x1f4bb; 基本用法 &#x1f9e9; 2. robot_state_publisher - 机器人状态发布器&#x1f4cc; 核心功能⚙️ 工作原理&#x1f9e…

第10讲、Odoo 18框架设计原理全解析

前言 Odoo是一套开源的企业资源规划(ERP)系统&#xff0c;以其模块化、可扩展性和全面的业务应用套件而闻名。Odoo 18作为其最新版本&#xff0c;在架构设计、前端技术和后端实现上都有显著的创新和优化。本文将从前端的OWL组件化、模块化&#xff0c;到后端的ORM封装&#xf…

MPC5744P——eTimer简介

1、eTimer结构图 eTimer模块提供&#xff1a; 六个相同的计数器/定时器通道一个看门狗定时器功能&#xff08;可能并非每个eTimer模块实例都具备&#xff09; 2、eTimer通道结构图 eTimer中的每个计时器/计数器通道结构图如下图所示&#xff0c;每个16位计数器/定时器通道包…

MySQL主从复制---笔记

一、MySQL主从复制架构 常见拓扑 基础一主一从 主库&#xff08;Master&#xff09;处理写操作&#xff0c;从库&#xff08;Slave&#xff09;同步数据并处理读请求。 适用场景&#xff1a;读写分离、数据备份。 一主多从 一个主库对应多个从库&#xff0c;显著提升读性能…

Wayland模式X11模式LinuxFB​​模式,Linux图形显示系统三大模式深度解析

Linux图形显示系统三大模式深度解析&#xff1a;Wayland &#xff0c; X11 &#xff0c; LinuxFB​​ ​​一、技术原理与架构设计​​ ​​LinuxFB&#xff08;帧缓冲直通模式&#xff09;​​ 工作原理​​&#xff1a;直接读写内核帧缓冲设备&#xff08;/dev/fb0&#x…