并发编程基础 - 并发编程的概念(C++)

前言

在当今多核处理器普及的时代,并发编程成为开发高性能应用程序的关键技术之一。无论是服务器端应用,桌面软件,还是移动应用,并发编程都扮演着重要角色。本文将详细介绍并发编程的基本概念,结合C++语言特性,帮助读者理解并掌握这一重要主题。

1. 什么是并发编程?

并发编程是指一个程序能够在同一时间段内执行多个任务的能力。这里的“多个任务”可以是不同的计算步骤、输入输出操作或与其他系统的交互等。值得注意的是,“同一时间段”并不严格意味着完全同时发生;它还包括交替快速地切换各个任务的情形,从宏观上看就像所有任务都在并行运行一样。

并发与并行的区别

  • 并发:指的是多个任务在同一时间段内被处理,它们之间可能交替执行。
  • 并行:指的则是真正的多任务同时进行,通常需要硬件支持,如多核CPU。

对于开发者来说,理解和正确使用并发编程,可以充分利用现代计算机的硬件资源,提高程序的性能和响应速度。

2. C++中的线程

C++11标准引入了对多线程的支持,使得我们可以在C++中轻松实现并发编程。线程是操作系统能够进行运算调度的最小单位,一个进程由一个或多个线程组成。每个线程都有自己的栈空间和局部变量,但共享进程的全局数据和其他资源。

创建线程

在C++中,创建线程非常简单,只需要包含头文件<thread>,然后使用std::thread类:

#include <iostream>
#include <thread>void print_hello() {std::cout << "Hello, thread!" << std::endl;
}int main() {// 创建一个新的线程来执行print_hello函数std::thread t(print_hello);// 等待线程结束if (t.joinable()) {t.join();}return 0;
}
线程参数传递

有时我们需要给线程传递参数,这也可以通过构造函数完成:

void print_message(const std::string& message) {std::cout << message << std::endl;
}int main() {std::string msg = "Hello from a thread!";std::thread t(print_message, msg);if (t.joinable()) {t.join();}return 0;
}
使用lambda表达式创建线程

除了直接传递函数名外,还可以使用C++11引入的lambda表达式来定义更灵活的任务逻辑:

int main() {int value = 42;std::thread t([value]() {std::cout << "Value is: " << value << std::endl;});if (t.joinable()) {t.join();}return 0;
}
3. 同步机制

当多个线程访问共享资源时,为了防止竞争条件(Race Condition),必须采取适当的同步措施。C++提供了多种同步工具,比如互斥量(Mutex)、读写锁(Read-Write Locks)等。

互斥量 Mutex

最常用的同步原语就是互斥量,它可以确保同一时间只有一个线程可以访问受保护的数据:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx; // 定义一个互斥量void print_block(int n, char c) {std::lock_guard<std::mutex> lock(mtx); // 自动锁定和解锁for (int i = 0; i < n; ++i) {std::cout << c;}std::cout << '\n';
}int main() {std::thread th1(print_block, 50, '*');std::thread th2(print_block, 50, '$');th1.join();th2.join();return 0;
}

这里使用了std::lock_guard自动管理锁的获取和释放,简化了代码,减少了出错的可能性。

总结

通过上述介绍,相信你已经对并发编程有了初步的认识,并且了解了如何在C++中创建线程以及基本的同步方法。当然,实际开发中还有很多细节需要注意,例如死锁问题、性能优化等,这些内容将在后续的文章中继续探讨。希望这篇博客能为你的并发编程之旅提供有价值的参考!

如果你有任何疑问或者想要了解更多相关内容,请随时留言交流!

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

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

相关文章

EigenLayer联合Cartesi:打造面向主流用户的DeFi、AI等新用例

EigenLayer 与 Cartesi 正在开展合作&#xff0c;致力于弥合基础设施协议与终端用户应用之间的鸿沟&#xff1b;鼓励核心开发人员构建人工智能代理、复杂 DeFi、游戏、社交网络等应用场景&#xff1b;得益于 Cartesi 基于 Linux 的协处理器&#xff0c;开发者可复用现有软件库和…

DeepSeek-R1论文研读:通过强化学习激励LLM中的推理能力

DeepSeek在朋友圈&#xff0c;媒体&#xff0c;霸屏了好长时间&#xff0c;春节期间&#xff0c;研读一下论文算是时下的回应。论文原址&#xff1a;[2501.12948] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 摘要&#xff1a; 我们…

MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译

感谢阅读 注意不含评估以后的翻译原论文地址标题以及摘要介绍部分MiniRAG 框架2.1 HETEROGENEOUS GRAPH INDEXING WITH SMALL LANGUAGE MODELS2.2 LIGHTWEIGHT GRAPH-BASED KNOWLEDGE RETRIEVAL2.2.1 QUERY SEMANTIC MAPPING2.2.2 TOPOLOGY-ENHANCED GRAPH RETRIEVAL 注意不含评…

Kafka中文文档

文章来源&#xff1a;https://kafka.cadn.net.cn 什么是事件流式处理&#xff1f; 事件流是人体中枢神经系统的数字等价物。它是 为“永远在线”的世界奠定技术基础&#xff0c;在这个世界里&#xff0c;企业越来越多地使用软件定义 和 automated&#xff0c;而软件的用户更…

【学习笔记】深度学习网络-正则化方法

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…

Flutter常用Widget小部件

小部件Widget是一个类&#xff0c;按照继承方式&#xff0c;分为无状态的StatelessWidget和有状态的StatefulWidget。 这里先创建一个简单的无状态的Text小部件。 Text文本Widget 文件&#xff1a;lib/app/app.dart。 import package:flutter/material.dart;class App exte…

浅色可视化大屏虽然经常被诟病,也有自己的用武之地呀

一、视觉舒适性与减轻疲劳 在长时间的使用和观察中&#xff0c;浅色可视化大屏能够为用户带来更舒适的视觉体验&#xff0c;减轻视觉疲劳。与深色背景相比&#xff0c;浅色背景通常反射的光线较少&#xff0c;对眼睛的刺激相对较小。尤其是在需要长时间盯着大屏进行数据分析…

Office / WPS 公式、Mathtype 公式输入花体字、空心字

注&#xff1a;引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 使用空心字时&#xff0c;一般不用斜体&#xff0c;取消勾选 “斜体”。 2、Mathtype 公式输入花体字、空心字 2.1 直接输…

el-table组件样式如何二次修改?

文章目录 前言一、去除全选框按钮样式二、表头颜色的修改 前言 ElementUI中的组件el-table表格组件提供了丰富的样式&#xff0c;有一个全选框的el-table组件&#xff0c;提供了全选框和多选。 一、去除全选框按钮样式 原本默认是有全选框的。假如有一些开发者&#xff0c;因…

Python安居客二手小区数据爬取(2025年)

目录 2025年安居客二手小区数据爬取观察目标网页观察详情页数据准备工作&#xff1a;安装装备就像打游戏代码详解&#xff1a;每行代码都是你的小兵完整代码大放送爬取结果 2025年安居客二手小区数据爬取 这段时间需要爬取安居客二手小区数据&#xff0c;看了一下相关教程基本…

【13】WLC HA介绍和配置

1.概述 本文对AireOS WLC的HA进行介绍,和大多数网络架构设计一样,单台的WLC是无法保证设备的冗余性的,而且WLC也不是双引擎的设备,所以需要依靠High Available的技术来为WLC提供高可用性。 2.WLC HA类型 AireOS WLC的高可用性技术可以分为N+1的SSO的HA。不是所有的设备都…

因果推断与机器学习—用机器学习解决因果推断问题

Judea Pearl 将当前备受瞩目的机器学习研究戏谑地称为“仅限于曲线拟合”,然而,曲线拟合的实现绝非易事。机器学习模型在图像识别、语音识别、自然语言处理、蛋白质分子结构预测以及搜索推荐等多个领域均展现出显著的应用效果。 在因果推断任务中,在完成因果效应识别之后,需…

Hot100之矩阵

73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…

【深度分析】DeepSeek大模型技术解析:从架构到应用的全面探索

深度与创新&#xff1a;AI领域的革新者 DeepSeek&#xff0c;这个由幻方量化创立的人工智能公司推出的一系列AI模型&#xff0c;不仅在技术架构上展现出了前所未有的突破&#xff0c;更在应用领域中开启了无限可能的大门。从其混合专家架构&#xff08;MoE&#xff09;到多头潜…

【VM】VirtualBox安装CentOS8虚拟机

阅读本文前&#xff0c;请先根据 VirtualBox软件安装教程 安装VirtualBox虚拟机软件。 1. 下载centos8系统iso镜像 可以去两个地方下载&#xff0c;推荐跟随本文的操作用阿里云的镜像 centos官网&#xff1a;https://www.centos.org/download/阿里云镜像&#xff1a;http://…

gentoo 中更改$PS1

现象&#xff1a;gentoo linux Xfce桌面&#xff0c;Terminal 终端&#xff0c;当进入很深的目录时&#xff0c;终端提示符会很长&#xff0c;不方便。如下图所示&#xff1a; 故需要修改$PS1 gentoo 默认的 PS1 在 /etc/bash/bashrc .d/10-gentoo-color.bash中定义&a…

【深度学习】DeepSeek模型介绍与部署

原文链接&#xff1a;DeepSeek-V3 1. 介绍 DeepSeek-V3&#xff0c;一个强大的混合专家 (MoE) 语言模型&#xff0c;拥有 671B 总参数&#xff0c;其中每个 token 激活 37B 参数。 为了实现高效推理和成本效益的训练&#xff0c;DeepSeek-V3 采用了多头潜在注意力 (MLA) 和 De…

攻防世界_simple_php

同类型题&#xff08;更难版->&#xff09;攻防世界_Web(easyphp)&#xff08;php代码审计/json格式/php弱类型匹配&#xff09; php代码审计 show_source(__FILE__)&#xff1a;show_source() 函数用于显示指定文件的源代码&#xff0c;并进行语法高亮显示。__FILE__ 是魔…

工具的应用——安装copilot

一、介绍Copilot copilot是一个AI辅助编程的助手&#xff0c;作为需要拥抱AI的程序员可以从此尝试进入&#xff0c;至于好与不好&#xff0c;应当是小马过河&#xff0c;各有各的心得。这里不做评述。重点在安装copilot的过程中遇到了一些问题&#xff0c;然后把它总结下&…

Java数据结构和算法(一)

1、综述 1.1 数据结构和算法能起到什么作用&#xff1f; 现实世界的数据存储程序员的工具建模 1.2 数据结构的概述 1.1.png 1.1_2.png 1.3 算法的概述 对于大多数数据结构来说&#xff0c;都需要知道 插入一条新的数据项寻找某一特定的数据项删除某一特定的数据项 还需要知道如…