C++语言的并发编程

C++语言的并发编程

引言

随着计算机技术的飞速发展,尤其是多核处理器的普及,如何高效地利用计算机资源成为了一个重要话题。在这个背景下,并发编程已经成为了一种必须掌握的技能。C++作为一种强大的编程语言,也提供了丰富的工具和库来支持并发编程。本文将详细探讨C++中的并发编程概念、技术及实例,以帮助读者更深入地理解这一领域。

并发编程的基础概念

1. 什么是并发?

并发指的是多个进程或线程在同一时间段内执行,可以是交错执行或真正的同时执行。与串行执行相对,并发能够提高程序的执行效率,更好地利用多核处理器的资源。

2. 线程与进程的区别

  • 进程是操作系统中的一个基本执行单元,拥有独立的地址空间和资源。
  • 线程是进程中的一个执行路径,同一进程中的多个线程可以共享进程的资源(如内存),但每个线程有自己的执行栈和程序计数器。

3. 并行与并发

并发是一种概念,是指程序在逻辑上能够同时执行多个任务,而并行是物理上的执行,指在多个处理器上同时执行多个任务。并发不一定意味着并行,但并行必然包含并发。

C++中的并发编程

C++从C++11标准开始,正式引入了对并发编程的支持。新标准提供了线程库、原子操作、条件变量等功能,极大地丰富了并发编程的工具。

1. 线程的创建与管理

在C++11中,std::thread类用于创建和管理线程。我们可以通过传递函数指针、函数对象或 lambda 表达式来启动新线程。

示例:

```cpp

include

include

void threadFunction(int id) { std::cout << "线程 " << id << " 正在运行" << std::endl; }

int main() { std::thread t1(threadFunction, 1); std::thread t2(threadFunction, 2);

t1.join(); // 等待线程t1完成
t2.join(); // 等待线程t2完成return 0;

} ```

在这个例子中,我们创建了两个线程并分别执行threadFunction函数。调用join方法可以等待线程完成。

2. 互斥量与数据保护

在并发编程中,多个线程往往会访问共享数据,这时候就需要对共享数据进行保护,以避免数据竞争。C++提供了std::mutex类来实现互斥锁。

示例:

```cpp

include

include

include

std::mutex mtx; int counter = 0;

void increment(int id) { for (int i = 0; i < 10000; ++i) { mtx.lock(); // 锁定互斥量 ++counter; mtx.unlock(); // 解锁互斥量 } }

int main() { std::thread t1(increment, 1); std::thread t2(increment, 2);

t1.join();
t2.join();std::cout << "最终计数器值: " << counter << std::endl; // 保证数据安全性
return 0;

} ```

在这个示例中,我们使用std::mutex来保护counter变量,确保在任何时刻只有一个线程可以修改它。

3. 条件变量

条件变量用于在线程之间进行通知。C++通过std::condition_variable提供了条件变量的实现,它能够使线程以某种条件等待。

示例:

```cpp

include

include

include

include

std::mutex mtx; std::condition_variable cv; bool ready = false;

void worker() { std::unique_lock lock(mtx); while (!ready) cv.wait(lock); // 等待条件变量

std::cout << "工作线程开始工作" << std::endl;

}

int main() { std::thread t(worker);

{std::lock_guard<std::mutex> lock(mtx);ready = true; // 改变状态
}cv.notify_one(); // 通知等待的线程
t.join();return 0;

} ```

在这个例子中,worker线程在条件变量上等待。当主线程改变ready状态并调用notify_one时,worker线程被唤醒,开始执行任务。

4. 原子操作

C++11提供了原子类型(std::atomic),用于在多个线程中安全地操作共享变量。原子操作确保了在多个线程同时操作变量时的安全性,并且不需要使用锁。

示例:

```cpp

include

include

include

std::atomic counter(0);

void increment() { for (int i = 0; i < 10000; ++i) { ++counter; // 原子操作,线程安全 } }

int main() { std::thread t1(increment); std::thread t2(increment);

t1.join();
t2.join();std::cout << "最终计数器值: " << counter.load() << std::endl; // 获取原子变量值
return 0;

} ```

这里,使用std::atomic<int>来定义一个原子计数器,在多个线程中安全地进行自增操作,而无需额外的锁定机制。

5. 线程的管理与异常处理

在C++中,手动管理线程的生命周期是必要的,尤其是确保每个线程在程序结束前完成。使用std::terminate处理未完成的线程,以防止程序异常结束。

示例:

```cpp

include

include

include

void mayThrow() { throw std::runtime_error("线程抛出异常"); }

int main() { std::thread t(mayThrow);

try {t.join(); // 等待线程结束
} catch (const std::exception& e) {std::cerr << "捕获到异常: " << e.what() << std::endl;// 在此处理异常
}return 0;

} ```

在上例中,我们创建了一个可能抛出异常的线程,并在主线程中捕获这个异常。这表明我们需要在多线程环境中谨慎处理异常。

高级特性

1. 任务与线程池

C++标准库并未直接提供线程池的实现,但我们可以使用std::async来提交任务。这个功能使得我们能够以更加直观的方式处理并发任务。

示例:

```cpp

include

include

int doWork() { // 模拟耗时操作 return 42; }

int main() { std::future result = std::async(std::launch::async, doWork);

// 在此可以做其他事情
std::cout << "Doing some other work..." << std::endl;// 获取结果
std::cout << "Result: " << result.get() << std::endl;return 0;

} ```

在这个示例中,我们使用std::async启动一个异步任务,返回一个std::future对象,通过该对象我们可以获取任务的结果。

2. 并发容器

C++标准库中的并发容器尚不完善,然而,可以使用如Intel的TBB(Threading Building Blocks)等库提供的并发容器。它们能够更好地管理并发任务和数据容器,避免手动管理锁的问题。

结语

C++中的并发编程为我们提供了强大的工具来创建高效且响应迅速的应用程序。通过合理使用线程、互斥量、条件变量和原子操作,我们可以在保证数据安全性的同时,有效提升程序的性能。虽然并发编程带来了难度和挑战,但也是提升程序执行效率的关键。希望本文能够帮助读者更好地理解C++中的并发编程,开创出更高效的编程实践。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web应用安全-漏洞扫描器设计与实现

摘 要 随着Web2.0、社交网络、微博等一系列新型的互联网产品的诞生&#xff0c;基于Web环境的互联网应用越来越广泛&#xff0c;企业信息化的过程中各种应用都架设在Web平台上。Web应用的迅速发展也引起黑客们的强烈关注&#xff0c;接踵而至的就是Web安全威胁的凸显&#xff…

【漏洞工具】小米路由器任意文件读取漏洞python图形化框架利用工具(poc|exp)

there is no tomorrow 工具利用 漏洞扫描 漏洞利用 poc 本文工具、源码获取 因本工具涉及到源码分享&#xff0c;如有需求&#xff0c;请私聊圈主 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播或利用…

【Logstash03】企业级日志分析系统ELK之Logstash 过滤 Filter 插件

Logstash 过滤 Filter 插件 数据从源传输到存储库的过程中&#xff0c;Logstash 过滤器能够解析各个事件&#xff0c;识别已命名的字段以构建结构&#xff0c; 并将它们转换成通用格式&#xff0c;以便进行更强大的分析和实现商业价值。 Logstash 能够动态地转换和解析数据&a…

游戏关卡设计的常用模式

游戏关卡分为很多种&#xff0c;但常用的有固定套路&#xff0c;分为若干种类型。 关卡是主角与怪物、敌方战斗的场所&#xff0c;包括装饰物、通道。 单人游戏的关卡较小&#xff0c;偏线性&#xff1b; 联机/MMO的关卡较大&#xff0c;通道多&#xff0c;自由度高&#xf…

用OpenCV实现UVC视频分屏

分屏 OpencvUVC代码验证后话 用OpenCV实现UVC摄像头的视频分屏。 Opencv opencv里有很多视频图像的处理功能。 UVC Usb 视频类&#xff0c;免驱动的。视频流格式有MJPG和YUY2。MJPG是RGB三色通道的。要对三通道进行分屏显示。 代码 import cv2 import numpy as np video …

用户界面软件02

基于表单的用户界面 在“基于表单的用户界面”里面&#xff0c;用户开始时选中某个业务处理&#xff08;模块&#xff09;&#xff0c;然后应用程序就使用一系列的表单来引导用户完成整个处理过程。大型机系统上的大部分用户界面都是这样子的。[Cok97]中有更为详细的讨论。 面…

使用Registry explore实现法医检查练习

Windows Forensics 1&#xff08;windows 取证&#xff09; 第一题&#xff1a; 关于用户的基本都在sam注册表中&#xff0c;所以使用Registry explore&#xff0c;添加一个sam进来检查&#xff0c;通常sam注册表都是在C:\Windows\System32\config中 接着就可以开始我们的检验…

Linux服务器网络不通问题排查及常用命令使用

在PVE主机上创建虚拟机&#xff0c;并配置静态ip和dns后&#xff0c;主机可以正常访问网络&#xff0c;但是在宿主机或者其他机器上都无法访问该虚拟机。 检查ip是否联通且端口是否开启 如果ip无法ping通&#xff0c;可能是静态ip配置、网卡或桥接设置问题。 [k8slocalhost …

道品科技智慧农业与云平台:未来农业的变革之路

随着全球人口的不断增长&#xff0c;农业面临着前所未有的挑战。如何在有限的土地和资源上提高农业生产效率&#xff0c;成为了各国政府和农业从业者亟待解决的问题。智慧农业的兴起&#xff0c;结合云平台的应用&#xff0c;为农业的可持续发展提供了新的解决方案。 ## 一、智…

《C++11》右值引用深度解析:性能优化的秘密武器

C11引入了一个新的概念——右值引用&#xff0c;这是一个相当深奥且重要的概念。为了理解右值引用&#xff0c;我们需要先理解左值和右值的概念&#xff0c;然后再理解左值引用和右值引用。本文将详细解析这些概念&#xff0c;并通过实例进行说明&#xff0c;以揭示右值引用如何…

【OJ刷题】同向双指针问题

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

RK3562编译Android13 ROOT固件教程,触觉智能开发板演示

本文介绍编译Android13 ROOT权限固件的方法&#xff0c;触觉智能RK3562开发板演示&#xff0c;搭载4核A53处理器&#xff0c;主频高达2.0GHz&#xff1b;内置独立1Tops算力NPU&#xff0c;可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。 关闭seli…

用户界面的UML建模11

然而&#xff0c;在用户界面方面&#xff0c;重要的是要了解《boundary》类是如何与这个异常分层结构进行关联的。 《exception》类的对象可以作为《control》类的对象。因此&#xff0c;《exception》类能够聚合《boundary》类。 参见图12&#xff0c;《exception》Database…

【大模型】百度千帆大模型对接LangChain使用详解

目录 一、前言 二、LangChain架构与核心组件 2.1 LangChain 核心架构 2.2 LangChain 核心组件 三、环境准备 3.1 前置准备 3.1.1 创建应用并获取apikey 3.1.2 开通付费功能 3.2 获取LangChain文档 3.3 安装LangChain依赖包 四、百度千帆大模型对接 LangChain 4.1 LL…

用Python实现简单的任务自动化

目录 1. 自动发送邮件提醒 2. 自动备份文件 3. 自动下载网页内容 总结 在现代工作和生活中,任务自动化可以极大地提高效率和准确性。Python,作为一种功能强大且易于学习的编程语言,是实现任务自动化的理想选择。本文将通过几个简单而实用的案例,展示如何用Python实现任…

用JAVA编写一个简单的小游戏

用Java语言编写一个简单的小游戏。这里是一个非常基础的猜数字小游戏的代码示例。在这个游戏中&#xff0c;程序会随机选择一个1到100之间的整数&#xff0c;玩家需要猜测这个数字是什么。每次猜测后&#xff0c;程序会告诉玩家他们猜的数字是太高了、太低了还是正确。 impor…

腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器

作品简介 在CTFer选手比赛做crypto的题目时&#xff0c;一些题目需要自己去解密&#xff0c;但是解密的工具大部分在线上&#xff0c;而在比赛过程中大部分又是无网环境&#xff0c;所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c;通过…

MATLAB深度学习实战文字识别

文章目录 前言视频演示效果1.DB文字定位环境配置安装教程与资源说明1.1 DB概述1.2 DB算法原理1.2.1 整体框架1.2.2 特征提取网络Resnet1.2.3 自适应阈值1.2.4 文字区域标注生成1.2.5 DB文字定位模型训练 2.CRNN文字识别2.1 CRNN概述2.2 CRNN原理2.2.1 CRNN网络架构实现2.2.2 CN…

EXCEL: (二) 常用图表

10. 图表 134-添加.删除图表元素 图表很少是一个单独的整体&#xff0c;而是由十几种元素/对象拼凑出来的。 学习图表就是学习当中各类元素的插删改。 ①图表中主要元素的定义 图表上的一个颜色就是一个系列。 横轴是分类轴&#xff0c;将每个系列都分为几类。 ②选中图…

晨辉面试抽签和评分管理系统之一:考生信息管理和编排

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…