当前位置: 首页 > article >正文

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

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执行完成,才会继续往下执行,否则主线程自顾自执行并结束。

相关文章:

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

1、并发是什么 并发是指两个或更多独立的活动同时发生&#xff0c;现实生活中常见的并发场景如边吃饭边看手机。 1.1、计算机中的并发&#xff1a; 计算机领域的并发是指在单个系统里同时执行多个独立的任务&#xff0c;而非顺序的进行一些活动。 我们在电脑上能够边听音乐边和…...

Mysql库的操作和表的操作

Mysql库和表的操作 库的操作1.查看数据库列表2.创建数据库3.使用数据库4.查看当前在那个数据库中5.显示数据库的创建语句6.修改数据库7.删除数据库8.备份和恢复数据库9.查看数据的连接情况(简单来说就是查看有多少人使用你的数据库) 表的操作1.创建表2.查看表结构3.修改表本身(…...

LangChain-结合GLM+SQL+函数调用实现数据库查询(三)

针对 LangChain-结合GLM+SQL+函数调用实现数据库查询(二)-CSDN博客 进一步简化 通过 LangChain 和大语言模型(GLM-4)实现了一个 AI 代理,能够根据自然语言提问自动生成 SQL 查询语句,并连接 MySQL 数据库执行查询,最终返回结果。 整个流程如下: 用户提问 → AI 生成 SQ…...

word文档格式规范(论文格式规范、word格式、论文格式、文章格式、格式prompt)

文章目录 prompt prompt [格式要求] - 字体&#xff1a;中文宋体小四&#xff1b;英文Times New Roman 12pt&#xff1b;标题黑体 - 行距&#xff1a;1.5倍&#xff08;段前段后0行&#xff09; - 边距&#xff1a;A4默认&#xff08;上下2.54cm&#xff0c;左右3.17cm&…...

Ubuntu 桌面版忘记账户密码的重置方法

如果你忘记了 Ubuntu 桌面版的用户密码&#xff0c;可以通过进入恢复模式&#xff08;Recovery Mode&#xff09;来重置密码。以下是详细步骤&#xff1a; 一、进入 GRUB 引导菜单 重启计算机&#xff1a;点击关机按钮&#xff0c;选择重启。在启动时按住 Shift 键&#xff1…...

抖音商城抓包 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 抓包展示 总结 1.出于安全考虑,本章未…...

[SC]sc_signal_rv的用法和sc_signal相比有什么优势?

sc_signal_rv的用法和sc_signal相比有什么优势? 在 SystemC 中,sc_signal<T> 是最常用的单驱动(single‐driver)信号通道;而 sc_signal_rv<W>(“rv” = resolved vector)则是一种多驱动、带总线(tri-state)分辨功能的信号。下面分几点来说明它们的…...

掌握 FreeRTOS:打造高效嵌入式系统的第一步

实例对比说明&#xff1a; 手机: 点击相机 -> 操作系统 -> 打开摄像头 无操作系统: 相机 -> 打开摄像头也能实现&#xff0c;但方式死板、不支持第三方应用 MCU 对比说明&#xff1a; 裸机开发: MCU -> 直接控制硬件 使用操作系统: MCU -> 操作系统 -> 硬…...

性能优化 - 案例篇:数据一致性

文章目录 Pre引言1. 分布式缓存概念2. Redis 与 Memcached 区别概览3. Spring Boot 中使用 Redis3.1 引入依赖与常用客户端3.2 RedisTemplate 的基本用法3.3 Spring Cache 注解式缓存 4. 秒杀业务简介及挑战5. Lua 脚本实现原子库存扣减5.1 准备阶段&#xff1a;数据预加载5.2 …...

Spring框架学习day6--事务管理

Spring事务管理 Spring事务管理是在AOP的基础上&#xff0c;当我们的方法完全执行成功后&#xff0c;再提交事务&#xff0c;如果方法中有异常&#xff0c;就不提交事务 Spring中的事务管理有两种方式&#xff1a; ​ 1.编程式事务 ​ 需要我们在业务代码中手动提交 ​ 2.声明式…...

免费酒店管理系统+餐饮系统+小程序点餐——仙盟创梦IDE

酒店系统主屏幕 房间管理 酒店管理系统的房间管理&#xff0c;可实现对酒店所有房间的实时掌控。它能清晰显示房间状态&#xff0c;如已预订、已入住、空闲等&#xff0c;便于高效安排入住与退房&#xff0c;合理分配资源&#xff0c;提升服务效率&#xff0c;保障酒店运营有条…...

Git企业级项目管理实战

目录 1. 准备工作 2. 添加成员 2.1 添加企业成员 2.2 添加项目成员 2.3 添加仓库开发人员 3. 开发场景 - 基于git flow模型的实践 3.1 新需求加入 3.2 修复测试环境 Bug 3.3 修改预发布环境Bug 3.4 修改正式环境 Bug 3.5 紧急修复正式环境 Bug 4. 拓展阅读 4.1 其…...

【实例】事业单位学习平台自动化操作

目录 一、创作背景: 二、实现逻辑: 三、代码分析【Deepseek分析】: 1) 主要功能 2)核心组件 2.1 GUI界面 (AutomationApp类) 2.2 浏览器自动化 2.3 平台特定处理 3) 关键技术 4)代码亮点 5)总结 四、运行截图: 五、程序代码: 特别声明:***本代码仅限编程学…...

4.8.3 利用SparkSQL统计每日新增用户

在本次实战中&#xff0c;我们的任务是利用Spark SQL统计每日新增用户数。首先&#xff0c;我们准备了用户访问历史数据&#xff0c;并将其上传至HDFS。然后&#xff0c;通过Spark的交互式编程环境&#xff0c;我们读取了用户文件并将其转换为结构化的DataFrame。接着&#xff…...

创建ipv6 only和ipv6+ip4的k8s集群的注意事项

关键字 : CNI calico vxlan flannel ipv6-only ipv6ipv4 在搭建ipv6-only或ipv6ipv4的k8s集群时&#xff0c;在worker节点加入集群后&#xff0c;发现worker节点上的CNI启动失败。 以下是calico的启动失败情况 : kubectl get pod -A输出如下 : NAMESPACE NAME …...

Qt概述:基础组件的使用

1. Qt框架简介 Qt是一个跨平台的C图形用户界面应用程序开发框架&#xff0c;它包含了丰富的GUI组件和强大的功能库。本次示例代码展示了Qt的几个核心概念&#xff1a; QMainWindow&#xff1a;主窗口类&#xff0c;提供标准的应用程序框架**信号与槽**机制&#xff1a;Qt的核…...

判断使用什么技术来爬取数据详细讲解

判断目标网站使用哪种数据加载形式是爬虫开发的第一步&#xff0c;也是最关键的一步。以下是系统化的诊断方法和步骤&#xff1a; 核心诊断流程 (使用浏览器开发者工具 - Chrome/Firefox为例) 初始观察 (肉眼判断) 页面加载后数据是否立刻可见&#xff1f; 是 → 可能是静态HTM…...

YOLOV7改进之融合深浅下采样模块(DSD Module)和轻量特征融合模块(LFI Module)

目录 一、研究背景​ 二. 核心创新点​ ​2.1 避免高MAC操作​ ​2.2 DSDM-LFIM主干网络​ 2.3 P2小目标检测分支​ ​3. 代码复现指南​ 环境配置 关键修改点 ​4. 实验结果对比​ 4.1 VisDrone数据集性能 4.2 边缘设备部署 4.3 检测效果可视化 ​5. 应用场景​ …...

【仿生机器人】仿生机器人认知-情感系统架构设计报告

来自 gemini 2.5 1. 执行摘要 本报告旨在为仿生机器人头部设计一个全面的认知-情感软件架构&#xff0c;以实现自然、情感智能的互动。拟议的架构将使机器人能够像人类一样&#xff0c;动态生成情绪、进行复杂的表情表达&#xff08;包括情绪掩饰&#xff09;、拥有强大的记忆…...

数学建模期末速成 多目标规划

内容整理自2-6-2 运筹优化类-多目标规划模型Python版讲解_哔哩哔哩_bilibili 求有效解的几种常用方法 线性加权法√ 根据目标的重要性确定一个权重&#xff0c;以目标函数的加权平均值为评价函数&#xff0c;使其达到最优。ɛ约束法 根据决策者的偏好&#xff0c;选择一个主要…...

常见ADB指令

目录 1. 设备连接与管理 2. 应用管理 3. 文件操作 4. 日志与调试 5. 屏幕与输入控制 6. 高级操作&#xff08;需Root权限&#xff09; 7. 无线调试&#xff08;无需USB线&#xff09; 常用组合示例 注意事项 以下是一些常用的 ADB&#xff08;Android Debug Bridge&a…...

IoTGateway项目生成Api并通过swagger和Postman调用

IoTGateway项目生成Api并通过swagger和Postman调用-CSDN博客...

sl4j+log4j日志框架

sl4jlog4j日志框架 slf4j (Simple Loging Facade For Java) 即它仅仅是一个为 Java 程序提供日志输出的统一接口&#xff0c;并不是一个具体的日志实现方案&#xff0c;所以单独的 slf4j 是不能工作的&#xff0c;必须搭配其他具体的日志实现方案&#xff08;例如&#xff1a;…...

小白的进阶之路系列之九----人工智能从初步到精通pytorch综合运用的讲解第二部分

张量是PyTorch中的核心数据抽象。这个交互式笔记本提供了一个深入的介绍torch. Tensor 类., 首先,让我们导入PyTorch模块。我们还将添加Python的数学模块来简化一些示例。 import torch import math创建张量 创建张量最简单的方法是调用torch.empty(): x = torch.empty(…...

深度学习与神经网络 前馈神经网络

1.神经网络特征 无需人去告知神经网络具体的特征是什么&#xff0c;神经网络可以自主学习 2.激活函数性质 &#xff08;1&#xff09;连续并可导&#xff08;允许少数点不可导&#xff09;的非线性函数 &#xff08;2&#xff09;单调递增 &#xff08;3&#xff09;函数本…...

NLP学习路线图(十四):词袋模型(Bag of Words)

在自然语言处理&#xff08;NLP&#xff09;的广阔天地中&#xff0c;词袋模型&#xff08;Bag of Words, BoW&#xff09; 宛如一块历经岁月沉淀的基石。它虽非当今最耀眼的明星&#xff0c;却为整个领域奠定了至关重要的基础&#xff0c;深刻影响了我们让计算机“理解”文本的…...

Oracle数据库事务学习

目录 一、什么是事务&#xff0c;事务的作用是什么 二、事务的四大特性(ACID) 1. 原子性(Atomicity) 2. 一致性(Consistency) 3. 隔离性(Isolation) 4. 持久性(Durability) 三、关于锁的概念——表锁、行锁、死锁、乐观/悲观锁、 1.行锁 2.表锁 3.死锁 4.乐观锁 5.…...

MySQL 全量 增量备份与恢复

目录 前言 一、MySQL 数据库备份概述 1. 数据备份的重要性 2. 数据库备份类型 2.1 从物理与逻辑的角度分类 2.2 从数据库的备份策略角度分类 3. 常见的备份方法 二、数据库完全备份操作 1. 物理冷备份与恢复 1.1 备份数据库 1.2 恢复数据库 2. mysqldump 备份与恢复…...

【仿生机器人系统设计】涉及到的伦理与安全问题

随着材料科学、人工智能与生物工程学的融合突破&#xff0c;仿生机器人正从科幻走向现实。它们被寄予厚望——在医疗康复、老年照护、极端环境作业甚至社交陪伴等领域释放巨大价值。然而&#xff0c;当机器无限趋近于“生命体”&#xff0c;其设计过程中潜伏的伦理与安全迷宫便…...

NodeJS全栈WEB3面试题——P5全栈集成与 DApp 构建

5.1 如何实现一个完整的 Web3 登录流程&#xff08;前端 后端&#xff09;&#xff1f; ✅ 核心机制&#xff1a;钱包签名 后端验签 Web3 登录是基于“消息签名”来验证用户链上身份&#xff0c;而非传统用户名/密码。 &#x1f4bb; 前端&#xff08;使用 MetaMask&#…...