【C++并发编程】(一)基本概念

文章目录

  • C++并发编程
    • 进程、线程、串行、并行和并发
    • 多线程与多进程并发
    • C++并发编程
    • 串行 v.s.并发

C++并发编程

进程、线程、串行、并行和并发

进程(Process): 进程是操作系统进行资源分配和调度的基本单位,它拥有独立的内存空间和系统资源,负责执行一个特定的程序或任务。

线程(Thread): 线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位,使用进程所拥有的资源,并由进程中的一个执行序列来执行。

串行(Serial Execution): 串行执行意味着在一个时间段内计算机只执行一个任务。例如,在一个单核CPU上,任务只能一个接一个地执行。

并行(Parallel Execution): 并行执行意味着多个任务可以在同一时间点被执行。这通常发生在多核或多处理器的计算机上,每个核心或处理器都可以独立地执行任务。

并发(Concurrent Execution): 并发是在极小的时间段内执行多个任务。并行是并发的一种实现方式(多进程)。除此之外,还可以通过在同一时间段内,交替执行一个进程的多个多个线程任务实现并发(多线程),只要交替的速度够快,在宏观上看起来就像是并行的。


例子:假设一个餐厅需要为客人做晚餐,有以下方案:
非并发

  • 串行: 一个厨师(单进程)按顺序做所有菜:先做前菜,然后做主菜,最后做甜点(单线程)。

并发:

  • 多线程并发 :一个厨师(单进程)同时做多个菜:在做前菜的过程中准备主菜的材料,然后在主菜烹饪时开始准备甜点。(多线程)
  • 多进程并发:(1)多个厨师(多进程)各自按顺序(单线程)做分配到的菜。 或者(2)多个厨师(多进程)各自同时(多线程)做多个菜。

多线程与多进程并发

多线程(Multithreading)并发
多线程并发的线程之间共享相同的进程的资源,可以更方便地共享数据。线程切换的开销较小,通信也较简单。但线程之间共享内存也使得容易出现资源竞争和死锁等问题。

常见应用场景:

  • 并行计算:适用于CPU密集型任务,如图像处理、计算密集型算法等。
  • 异步编程:适用于IO密集型任务,如网络通信、文件操作等。

多进程(Multiprocessing)并发
多进程可以利用多核处理器,实现真正的并行处理。每个进程有自己独立的内存空间,相互之间不会影响, 稳定性更高。但是,多进程的进程切换开销较大,系统资源消耗相对较高。多进程之间不会共享内存, 进程间通信相对复杂,通常需要使用进程间通信(Inter-Process Communication,IPC)机制。

常见应用场景:

  • 服务器编程:适用于需要处理大量客户端请求的服务器,如Web服务器、数据库服务器等。
  • 分布式计算:适用于需要利用多台计算机进行协作计算的任务,如MapReduce框架等。

C++并发编程

C++并发编程的原生支持主要包括以下几个方面:

  • 线程:C++11引入了标准线程库std::thread,它提供了一组用于创建、管理和同步线程的函数和类。
  • 互斥量:互斥量是一种同步原语,用于保护共享资源的并发访问。C++11提供了std::mutex类,它允许开发者在多个线程之间同步对共享资源的访问,以防止数据竞争和不一致性问题。
  • 条件变量:条件变量是一种用于线程间同步和通信的机制。C++11中的std::condition_variable类允许一个或多个线程等待某个特定条件的发生,当条件满足时,可以唤醒等待的线程。
  • 原子操作:原子操作是不可中断的操作,即在执行过程中不会被其他线程打断。C++11引入了std::atomic模板类,提供了一系列原子操作的函数和类,用于保证在多线程环境中对共享数据的访问是线程安全的。
  • 异步任务:C++11还提供了异步计算的支持,允许在不同线程中执行异步任务。std::futurestd::promise类用于获取异步操作的结果和设置异步操作的返回值。

C++标准并未对进程间通信提供任何原生支持,所以使用多进程的方式实现,这会依赖与平台相关的API。[1] 在Unix/Linux系统下,可以使用fork()系统调用来创建新的进程,而在Windows系统下,可以使用CreateProcess()等API来实现进程创建。

串行 v.s.并发

下面的两个程序都执行了两个任务 task1()task2()。第一个程序是串行执行,而第二个程序是并发执行。

  • 串行执行:
#include <iostream>
#include <chrono>void task1() {// 模拟耗时操作for (int i = 0; i < 50000000; ++i) {if (i % 20000000 == 0)std::cout << "task1:" << i << std::endl;}
}
void task2() {// 模拟耗时操作for (int i = 50000000; i < 100000000; ++i) {if (i % 20000000 == 0)std::cout << "task2:"<< i << std::endl;}
}int main() {auto start = std::chrono::steady_clock::now(); // 记录开始时间// 串行执行任务task1();task2();auto end = std::chrono::steady_clock::now(); // 记录结束时间// 计算执行时间std::chrono::duration<double> elapsed_seconds = end - start;// 输出执行时间std::cout << "Elapsed time: " << elapsed_seconds.count() << "s\n";return 0;
}
task1:0
task1:20000000
task1:40000000
task2:60000000
task2:80000000
Elapsed time: 0.6456s
  • 并发执行:
#include <iostream>
#include <thread>
#include <chrono>void task1() {// 模拟耗时操作for (int i = 0; i < 50000000; ++i) {if (i % 20000000 == 0)std::cout << "task1:" << i << std::endl;}
}
void task2() {// 模拟耗时操作for (int i = 50000000; i < 100000000; ++i) {if (i % 20000000 == 0)std::cout << "task2:" << i << std::endl;}
}int main() {auto start = std::chrono::steady_clock::now(); // 记录开始时间// 创建两个线程执行任务std::thread t1(task1);std::thread t2(task2);// 等待两个线程执行完毕t1.join();t2.join();auto end = std::chrono::steady_clock::now(); // 记录结束时间// 计算执行时间std::chrono::duration<double> elapsed_seconds = end - start;// 输出执行时间std::cout << "Elapsed time: " << elapsed_seconds.count() << "s\n";return 0;
}
task1:0
task2:60000000
task1:20000000
task2:80000000
task1:40000000
Elapsed time: 0.346405s

并发执行可以交替执行两个任务,最终消耗的时间比串行的少。

[1] https://nj.gitbooks.io/c/content/content/chapter1/chapter1-chinese.html

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

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

相关文章

详细设计(上)

结构程序化 三种基本控制结构 其他常用控制结构 人机界面设计 三条“黄金规则” 1、置用户于控制之下 2、减少用户记忆负担 3、保持界面一致 设计问题 设计人机界面过程中会遇到的4个问题&#xff1a; 1、系统响应时间 2、用户帮助设施 3、出错信息处理 4、命令交互 设计过…

蓝桥杯单片机省赛——第八届“基于单片机的电子钟程序设计与调试”程序部分

往期回顾 第三届蓝桥杯单片机省赛 第四届蓝桥杯单片机省赛 第五届蓝桥杯单片机省赛 第六届蓝桥杯单片机省赛 第七届蓝桥杯单片机省赛 文章目录 往期回顾一、前期准备二、代码详情1.基础代码蜂鸣器/继电器/led/定时器之类的代码 2.按键详解按键写法讲解 3.驱动的处理驱动写法讲…

由于找不到mfc140u.dll,无法继续执行的多种解决方法

在我们日常与计算机的密切互动中&#xff0c;或许不少用户都曾遇到过这样一个棘手的问题&#xff1a;系统突然弹出一个提示窗口&#xff0c;告知我们“找不到mfc140u.dll文件”。这个文件是Microsoft Foundation Class&#xff08;MFC&#xff09;库的一部分&#xff0c;用于支…

导数之光:探寻机器学习中的微变奥秘

在当今这个数据驱动的时代&#xff0c;机器学习以其强大的学习和预测能力&#xff0c;成为了推动科技进步的重要力量。而在机器学习的背后&#xff0c;数学原理&#xff0c;尤其是导数的应用&#xff0c;为其提供了坚实的理论支撑。本文将详细探讨导数在机器学习中的体现&#…

AgentScope: A Flexible yet Robust Multi-Agent Platform

# 文章推荐 # 文章名称&#xff1a;AgentScope: A Flexible yet Robust Multi-Agent Platform 文章链接&#xff1a;https://arxiv.org/pdf/2402.14034.pdf github链接&#xff1a;https://github.com/modelscope/agentscope 概述 这篇文章介绍了在多智能体系统中所面临的…

抖音小店运营实战班,全新升级 从零到进阶精通 分享月销百万小店核心秘密

课程内容&#xff1a; 1 2024抖音电商发展趋势及抖店运营策略(直播2024 0412).mp4 2 1-1抖音小店入驻流程(直播2024 04 12),mp4 3 1-2个体店铺VS企业店铺有什么区别(直播20240412).mp4 4 1-3抖音小店店铺搭建(直播2024 04 12).mp4 5 2-1-如何避免违禁词(附违禁词大全)(直播…

OpenHarmony实战开发-使用通用事件、触屏事件

触屏事件指当手指/手写笔在组件上按下、滑动、抬起时触发的回调事件。包括点击事件、拖拽事件和触摸事件。 图1 触摸事件原理 点击事件 点击事件是指通过手指或手写笔做出一次完整的按下和抬起动作。当发生点击事件时&#xff0c;会触发以下回调函数&#xff1a; onClick(ev…

智能消费记账|基于SSM+vue的大学生智能消费记账系统(源码+数据库+文档)

智能消费记账目录 基于SSMvue的大学生智能消费记账系统 一、前言 二、系统设计 三、系统功能设计 1 用户列表 2 预算信息管理 3 预算类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

【深耕 Python】Data Science with Python 数据科学(19)书402页练习题:模型准确率对比研究、KMeans算法的一点探讨

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文一览&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&…

Ant Design助力:实现用户列表的优雅展示与管理

文章目录 概要前端讲解登录组件注册组件用户列表组件 后端讲解连接数据库db.js路由routes.jsexpress应用app.js 启动项目小结 概要 在上一篇博客&#x1f6aa;中&#xff0c;我们已经成功实现了登录注册系统的基本功能。现在&#xff0c;我们将进一步完善系统&#xff0c;实现…

【Schrödinger薛定谔软件使用实战】- 4lyw蛋白实战

文章目录 软件选择1 pretein preparation1.1 import and process注意1.1.1 preprocess可能遇到的问题 1.2 review and modify1.3 refine1.3.1 optimize优化氢键网络1.3.2 minimize 氢原子会进行能量最小化 2 ligand prepare3 生成对接盒子-receptor grid generation3.1 recepto…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术&#xff0c;可以给玩家身临其境的感觉&#xff0c;接下来让我们学习这部分的内容吧&#xff01; SteamVR Input SteamVR绑定流程&#xff0c;在Windows窗口的点击SteamVR-input&#xff0c;图1&#xff0c;在这里可以选择你需要绑定…

守护数据安全: 零信任视角下的勒索病毒防范之道

前言 就在近日&#xff0c;鸿海集团旗下半导体设备大厂——京鼎精密科技股份有限公司&#xff08;以下简称“京鼎”&#xff09;遭到了黑客的入侵。黑客在京鼎官网公布信息直接威胁京鼎客户与员工&#xff0c;如果京鼎不支付赎金&#xff0c;客户资料将会被公开&#xff0c;员…

【项目纪实】某国有航空公司人力资源系统诊断咨询项目

公司的人力资源管理问题一直都比较严重&#xff0c;比如人员冗余、员工工作积极性差等问题&#xff0c;虽然经过多次的管理尝试&#xff0c;存在的问题仍然没有缓解。华恒智信人力资源咨询公司的老师特别专业&#xff0c;帮我们系统、全面的诊断了人力资源管理上存在的问题&…

BSP视频教程第30期:UDS ISO14229统一诊断服务CAN总线专题,常用诊断执行流程精讲,干货分享,图文并茂(2024-04-30)

视频教程汇总帖&#xff1a;【学以致用&#xff0c;授人以渔】2024视频教程汇总&#xff0c;DSP第12期&#xff0c;ThreadX第9期&#xff0c;BSP驱动第30期&#xff0c;USB实战第5期&#xff0c;GUI实战第3期&#xff08;2024-04-30&#xff09; - STM32F429 - 硬汉嵌入式论坛 …

目标检测发展概述

前言 本篇文章只是简单介绍一下目标检测这一计算机视觉方向的发展历史&#xff0c;因此重点在于介绍而不是完整阐述各个时期的代表算法&#xff0c;只要能够简单了解到目标检测的发展历史那么本文的目的就达到了。 目标检测的任务 从上图不难看出&#xff0c;目标检测是计算机…

71.网络游戏逆向分析与漏洞攻防-角色与怪物信息的更新-分析并利用角色与怪物创建的数据包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

Kubernetes - Dashboard 配置用户名密码方式登录

Kubernetes - Dashboard 配置用户名密码方式登录 前言&#xff1a; 为了 K8s 集群安全&#xff0c;默认情况下 Dashboard 以 Token的形式登录的&#xff0c;那如果我们想以用户名/密码的方式登录该怎么操作呢&#xff1f;其实只需要我们创建用户并进行 ClusterRoleBinding绑定即…

网站页面设计方案

网站页面设计方案是指对网站首页、频道页、文章页等页面的设计和布局进行统筹规划和实际操作的一系列方案。好的网站设计方案不仅要能够满足用户的使用需求&#xff0c;还要具有视觉美感和品牌形象的凸显。本文将从如何制定网站设计方案方面进行探讨。 1.确定网站定位和目标用户…

Flutter笔记:谈Material状态属性-为什么FlatButton等旧版按钮就废弃了

Flutter笔记 谈Material状态属性-为什么FlatButton等旧版按钮就废弃了 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this artic…