白骑士的C++教学高级篇 3.2 多线程与并发

系列目录

上一篇:白骑士的C++教学高级篇 3.1 文件操作

        随着计算机硬件的发展,现代计算机通常配备了多核处理器,为并发编程提供了硬件基础。C++11引入了一组强大的多线程库,使得开发多线程应用程序变得更加容易和安全。本篇内容将详细介绍C++11的多线程基础、线程管理和同步机制(互斥量与条件变量),帮助掌握C++中的多线程编程技术。

C++11多线程基础

        C++11标准库引入了多线程支持,提供了 ‘std::thread‘ 类用于创建和管理线程。使用 ‘std::thread‘ 类可以轻松地创建新线程并在其中执行代码。

创建线程

        创建线程最基本的方式是将一个函数传递给 ‘std::thread‘ 构造函数。下面是一个简单的示例,演示了如何创建和启动一个线程:

#include <iostream>
#include <thread>void printMessage() {std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(printMessage);// 等待线程完成t.join();return 0;
}

        在这段代码中,我们定义了一个名为 ‘printMessage‘ 的函数,并将其传递给 ‘std::thread‘ 构造函数来创建线程。使用 ‘t.join()‘ 方法等待线程完成执行。

传递参数

        可以通过构造函数将参数传递给线程函数,例如:

#include <iostream>
#include <thread>void printMessage(const std::string& message) {std::cout << message << std::endl;
}int main() {std::string msg = "Hello from thread with parameters!";std::thread t(printMessage, msg);t.join();return 0;
}

        在这段代码中,我们将一个字符串参数传递给 ‘printMessage‘ 函数,并在线程中打印该消息。

线程管理

        线程管理包括线程的创建、同步和销毁。C++11标准库提供了多种工具来帮助管理线程。

分离线程

        可以使用 ‘detach()‘ 方法将线程与主线程分离,允许线程在后台运行,例如:

#include <iostream>
#include <thread>void backgroundTask() {std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "Background task completed." << std::endl;
}int main() {std::thread t(backgroundTask);t.detach();std::cout << "Main thread continues to run..." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(3));return 0;
}

        在这段代码中,我们使用 ‘detach()‘ 方法分离线程,使其在后台运行,而主线程继续执行。

线程同步

        线程同步是确保多个线程安全地访问共享资源的关键。C++11提供了多种同步机制,如互斥量(mutex)和条件变量(condition variable)。

互斥量与条件变量

        互斥量和条件变量是同步多个线程访问共享资源的基本工具。

互斥量

        互斥量(mutex)用于保护共享资源,确保同一时间只有一个线程可以访问资源。C++11提供了 ‘std::mutex‘ 类来实现互斥量。

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void printNumbers(int start, int end) {std::lock_guard<std::mutex> guard(mtx);for (int i = start; i <= end; ++i) {std::cout << i << " ";}std::cout << std::endl;
}int main() {std::thread t1(printNumbers, 1, 5);std::thread t2(printNumbers, 6, 10);t1.join();t2.join();return 0;
}

        在这段代码中,我们使用 ‘std::mutex‘ 保护共享资源,并使用 ‘std::lock_guard‘ 自动管理互斥量的锁定和解锁。

条件变量

        条件变量(condition variable)用于在线程之间同步事件。C++11提供了 ‘std::condition_variable‘ 类来实现条件变量,例如:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;bool ready = false;void printNumbers(int id) {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return ready; });std::cout << "Thread " << id << " is running." << std::endl;
}void setReady() {std::unique_lock<std::mutex> lock(mtx);ready = true;cv.notify_all();
}int main() {std::thread t1(printNumbers, 1);std::thread t2(printNumbers, 2);std::this_thread::sleep_for(std::chrono::seconds(1));setReady();t1.join();t2.join();return 0;
}

        在这段代码中,我们使用 ‘std::condition_variable‘ 在线程之间同步事件。‘cv.wait(lock, [] { return ready; })‘ 用于等待条件满足,而 ‘cv.notify_all()‘ 用于通知所有等待线程条件已满足。

总结

        多线程与并发是C++编程中的重要概念,通过合理使用多线程技术,可以显著提高程序的性能和响应速度。C++11引入了一组强大的多线程库,使得多线程编程变得更加容易和安全。本篇内容详细介绍了C++11多线程基础、线程管理以及同步机制(互斥量与条件变量),希望通过这些内容,你能更好地掌握C++多线程编程技术,为编写高效、可靠的并发程序打下坚实的基础。

下一篇:白骑士的C++教学高级篇 3.3 内存管理​​​​​​​

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

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

相关文章

若依框架中Spring Cloud版本启动失败问题

RuoYiSystemApplication启动不了 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ruoyi.system.mapper.SysConfigMapper.selectConfigList 该问题是因为在我们拉取若依代码到本地之后&#xff0c;没有对配置作改动&#xff0c;而且若依…

在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的

哈希表&#xff08;散列表&#xff09;是一种非常重要的数据结构&#xff0c;它提供了快速的插入、查找和删除操作&#xff0c;平均时间复杂度接近O(1)。哈希表通过哈希函数将键&#xff08;key&#xff09;映射到表中的一个位置来访问记录&#xff0c;以加快查找速度。下面分别…

如何使用Python抓取动态网站数据

引言 动态网站的特点和数据抓取的挑战 动态网站通过JavaScript动态生成内容&#xff0c;这使得数据抓取变得更加复杂。传统的静态HTML解析方法无法获取这些动态生成的数据&#xff0c;因为它们在初始加载时并不存在于HTML源代码中。对于数据科学家和开发者来说&#xff0c;从这…

React Hook 总结(React 萌新升级打怪中...)

1 useCallback useMemo 和 useCallback 接收的参数都是一样&#xff0c;都是在其依赖项发生变化后才执行&#xff0c;都是返回缓存的值&#xff0c;区别在于 useMemo 返回的是函数运行的结果&#xff0c;useCallback 返回的是函数。 当需要使用 useCallback 的情况通常包括以…

Kylin系列入门

Kylin是中国最流行的开源大数据平台之一&#xff0c;主要用于解决大数据存储、处理和分析问题。Kylin的目标是将大数据分析变得更简单、更快速和更高效。下面是Kylin系列的入门指南&#xff0c;带有一些示例。 什么是 Kylin&#xff1f; Kylin是Apache Kylin项目下的一个开源…

服务器基础1

服务器基础复习01 1.环境部署 系统&#xff1a;华为欧拉系统 网络简单配置nmtui 因为华为欧拉系统密码需要复杂度 所以我们可以进入后更改密码 echo 123 | passwd --stdin root也可以 echo "root:123" | chpasswd2.关闭防火墙&#xff0c;禁用SElinux 首先先关…

Socket 简介与 Java Socket 编程示例

Socket&#xff08;套接字&#xff09;是网络通信中的一个关键概念&#xff0c;它是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一、定义与概念 基本概念&#xff1a;Socket可以被视为网络环境中进程间通信的API&#xff08;应用程序编程接口&#xff09;&…

彻底理解Linux的DISPLAY变量的作用

背景 最近遇到个两年前遇到的问题&#xff0c;使用virt-manager提示(virt-manager:873): Gtk-WARNING **: 14:53:28.147: cannot open display: :1&#xff0c;当时专门运维的同事帮忙临时调了下DISPLAY变量&#xff0c;好像是将:1改成了SSH用户本地IP:10.0&#xff0c;当时的…

每日一题——第十四题

题目&#xff1a;输入一行数字&#xff0c;将其按升序输出&#xff0c;且奇数在前&#xff0c;偶数在后 #include<stdio.h>void bubbleSort(int* arr, int n); int main(){int n, i, input_nums;printf("请输入数字个数&#xff1a; ");scanf("%d",…

纠正和防止机器学习中的不公平现象

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识AI 进阶&#xff1a;企业项目实战 预处理、处理中、后处理方法和非定量方法 机器学习中的公平性是一个复杂的问题。更糟糕的是&#xff0c;负…

加密传输及相关安全验证:

1.1. 加密&#xff1a; 1.1.1. 对称加密&#xff1a; 特点&#xff1a;加解密用一个密钥&#xff0c;加解密效率高&#xff0c;速度快&#xff0c;有密钥交互的问题问题&#xff1a;双方如何交互对称密钥的问题&#xff0c;用非对称密钥的公钥加密对称密钥的混合加密方式常用…

[数据分析]脑图像处理工具

###############ATTENTION&#xff01;############### 非常需要注意软件适配的操作系统&#xff01;有些仅适用于Linux&#xff0c;可以点进各自软件手册查看详情。 需要自行查看支持的影像模态。 代码库和软件我没有加以区分。 不是专门预处理的博客&#xff01;&#xf…

C语言 底层逻辑详细阐述指针(一)万字讲解 #指针是什么? #指针和指针类型 #指针的解引用 #野指针 #指针的运算 #指针和数组 #二级指针 #指针数组

文章目录 前言 序1&#xff1a;什么是内存&#xff1f; 序2&#xff1a;地址是怎么产生的&#xff1f; 一、指针是什么 1、指针变量的创建及其意义&#xff1a; 2、指针变量的大小 二、指针的解引用 三、指针类型存在的意义 四、野指针 1、什么是野指针 2、野指针的成因 a、指…

深入理解TCP/IP协议:三次握手与四次挥手

以下是一篇关于TCP/IP握手和挥手过程的CSDN博客文章草稿&#xff1a; 摘要 TCP&#xff08;传输控制协议&#xff09;是互联网上使用最广泛的协议之一&#xff0c;它负责在网络中的两个主机之间提供可靠的、有序的和错误检测功能的数据传输。本文将详细介绍TCP的三次握手过程和…

《基于 Kafka + Quartz 实现时限质控方案》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

Activiti7+ SpringBoot+SpringMVC 开发

添加 Controller 类 代码如下&#xff1a; RestController public class MyController {Autowiredprivate ProcessRuntime processRuntime;Autowiredprivate TaskRuntime taskRuntime;Autowiredprivate SecurityUtil securityUtil; }实现任务完成 RequestMapping("test…

学习分布式事务遇到的小bug

一、介绍Seata 在处理分布式事务时我用到是Seata&#xff0c;Seata的事务管理中有三个重要的角色&#xff1a; TC (Transaction Coordinator) - 事务协调者&#xff1a;维护全局和分支事务的状态&#xff0c;协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器…

从零开始学习cartographer源码 | 02.cartographer_ros—node_main.cc

从零开始学习cartographer源码 | 02.cartographer_ros—node_main.cc cartographer_ros程序的入口 main()函数程序的主函数Run()函数 特别&#xff08;防杠&#xff09;声明&#xff1a;《从零开始学习cartographer源码》系列文章仅仅是本人学习cartographer的学习笔记&#xf…

PHP pwn 学习 (2)

文章目录 A. 逆向分析A.1 基本数据获取A.2 函数逆向zif_addHackerzif_removeHackerzif_displayHackerzif_editHacker A.3 PHP 内存分配 A.4 漏洞挖掘B. 漏洞利用B.1 PHP调试B.2 exp 上一篇blog中&#xff0c;我们学习了一些PHP extension for C的基本内容&#xff0c;下面结合一…

Open3D Ransac算法拟合点云球面

目录 一、概述 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2拟合后点云 前期试读&#xff0c;后续会将博客加入该专栏&#xff0c;欢迎订阅 Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 RANSAC&a…