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

http://www.lryc.cn/news/2396743.html

相关文章:

  • Mysql库的操作和表的操作
  • LangChain-结合GLM+SQL+函数调用实现数据库查询(三)
  • word文档格式规范(论文格式规范、word格式、论文格式、文章格式、格式prompt)
  • Ubuntu 桌面版忘记账户密码的重置方法
  • 抖音商城抓包 分析
  • [SC]sc_signal_rv的用法和sc_signal相比有什么优势?
  • 掌握 FreeRTOS:打造高效嵌入式系统的第一步
  • 性能优化 - 案例篇:数据一致性
  • Spring框架学习day6--事务管理
  • 免费酒店管理系统+餐饮系统+小程序点餐——仙盟创梦IDE
  • Git企业级项目管理实战
  • 【实例】事业单位学习平台自动化操作
  • 4.8.3 利用SparkSQL统计每日新增用户
  • 创建ipv6 only和ipv6+ip4的k8s集群的注意事项
  • Qt概述:基础组件的使用
  • 判断使用什么技术来爬取数据详细讲解
  • YOLOV7改进之融合深浅下采样模块(DSD Module)和轻量特征融合模块(LFI Module)
  • 【仿生机器人】仿生机器人认知-情感系统架构设计报告
  • 数学建模期末速成 多目标规划
  • 常见ADB指令
  • IoTGateway项目生成Api并通过swagger和Postman调用
  • sl4j+log4j日志框架
  • 小白的进阶之路系列之九----人工智能从初步到精通pytorch综合运用的讲解第二部分
  • 深度学习与神经网络 前馈神经网络
  • NLP学习路线图(十四):词袋模型(Bag of Words)
  • Oracle数据库事务学习
  • MySQL 全量 增量备份与恢复
  • 【仿生机器人系统设计】涉及到的伦理与安全问题
  • NodeJS全栈WEB3面试题——P5全栈集成与 DApp 构建
  • 鸿蒙进阶——Mindspore Lite AI框架源码解读之模型加载详解(一)