C++ 多线程编程和同步机制:详解和实例演示

news2024/11/18 15:52:23

C++中的多线程编程和同步机制使得程序员可以利用计算机的多核心来提高程序的运行效率和性能。本文将介绍多线程编程和同步机制的基本概念和使用方法。

多线程编程基础

在C++中,使用<thread>库来创建和管理线程。线程可以通过函数、成员函数或者Lambda表达式来实现。以下是一个使用Lambda表达式来创建线程的例子:

 #include <thread>
 #include <iostream>
 
 int main() {
     std::thread t([](){
         std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
     });
     t.join();
     return 0;
 }

上述代码创建了一个线程并输出了该线程的ID。在创建线程时,需要将线程函数作为参数传递给std::thread。在上述例子中,我们使用了Lambda表达式来定义线程函数,该表达式会输出一行文本。

同步机制

多线程编程中最常见的问题是数据竞争和死锁。为了避免这些问题,我们需要使用同步机制来控制线程的访问。

互斥量

互斥量是C++中最常用的同步机制之一。互斥量可以保证同一时间只有一个线程可以访问共享资源。以下是一个使用互斥量来保护共享资源的例子:

 #include <thread>
 #include <mutex>
 #include <iostream>
 
 std::mutex mtx;
 
 void thread_func() {
     mtx.lock();
     std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
     mtx.unlock();
 }
 
 int main() {
     std::thread t1(thread_func);
     std::thread t2(thread_func);
     t1.join();
     t2.join();
     return 0;
 }

上述代码创建了两个线程,并使用互斥量来保护共享资源。在线程函数中,我们先调用mtx.lock()函数来锁定互斥量,然后访问共享资源,最后再调用mtx.unlock()函数来释放互斥量。在上述例子中,我们使用了两个线程来访问共享资源,但是只有一个线程可以访问该资源。这是因为在一个线程访问共享资源时,该资源会被锁定,其他线程无法访问该资源,直到该线程释放互斥量为止。

条件变量

条件变量是C++中另一个常用的同步机制。条件变量可以让线程在某些条件满足时才继续执行,否则就等待。以下是一个使用条件变量来同步线程的例子:

 #include <thread>
 #include <mutex>
 #include <condition_variable>
 #include <iostream>
 
 std::mutex mtx;
 std::condition_variable cv;
 bool ready = false;
 
 void consumer() {
     std::unique_lock<std::mutex> lock(mtx);
     cv.wait(lock, [](){ return ready; });
     std::cout << "Hello from consumer thread " << std::this_thread::get_id() << std::endl;
 }
 
 void producer() {
     std::this_thread::sleep_for(std::chrono::seconds(1));
     ready = true;
     cv.notify_one();
 }
 
 int main() {
     std::thread t1(consumer);
     std::thread t2(producer);
     t1.join();
     t2.join();
     return 0;
 }

上述代码创建了两个线程,一个生产者线程和一个消费者线程。生产者线程在1秒后将ready变量设置为true,然后通知消费者线程继续执行。消费者线程等待条件变量cv,直到ready变量的值为true为止。在该例子中,我们使用了条件变量来同步生产者和消费者线程。

结论

多线程编程和同步机制是C++中非常重要的主题。本文介绍了多线程编程的基本概念和使用方法,以及互斥量和条件变量等常用的同步机制。希望这篇文章对你有所帮助。

最后

为了方便其他设备和平台的小伙伴观看往期文章:公众号搜索Let us Coding,或者扫描下方二维码,关注公众号,即可获取最新文章。

看完如果觉得有帮助,欢迎点赞、收藏关注

在这里插入图片描述

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

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

相关文章

基于C#使用winform技术的游戏平台的实现【C#课程设计】

基于C#使用winform技术的游戏平台的实现【C#课程设计】 说明项目结构项目运行截图及实现的功能 部分代码一些说明(个人觉得一些难点的说明)一、ListView &#xff0c;ImageList 的综合使用二、图片上传以及picturebox 图片的动态替换三、图表插件的使用四、SQL工具类封装五、高…

最新哔哩哔哩邮箱绑定接口签名JS逆向分析

本章教程主要逆向分析 哔哩哔哩邮箱绑定接口biliCSRF 和mid 参数。 教程仅供学习参考,请勿滥用,由此带来的法律责任需由自己承担。 目录 一、接口参数分析 二、签名加密代码 三、滑块验证码 一

LabVIEW应用开发——控件的使用(四)

接上文&#xff0c;这篇介绍时间控件。 LabVIEW应用开发——控件的使用&#xff08;三&#xff09; 1、时间控件Time Stamp control 在日常软件开发场景中&#xff0c;时间也是一种常用的控件&#xff0c;用于表达当前时间的显示、对下设置时间、时间同步等等场景。LabVIEW专门…

Redis主从模式(一)----搭建主从结构并演示

目录 一, 主从模式 1.1 单个Redis服务器可能存在的问题 1.2 单点问题 1.3 什么是主从模式 概念 图示 二, 演示Redis的主从复制 2.1 Redis-server进程 2.2 建立复制 1. 首先将redis.conf配置文件复制一份并修改daemonize 为 yes 2.修改配置文件中的端口号 3. 分别在…

力扣每日一题63:不同路径||

题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物…

RK3568平台开发系列讲解(应用篇)串口应用编程之串口介绍

🚀返回专栏总目录 文章目录 一、串口介绍1.1、数据传输方式1.2、数据格式1.3、波特率1.4、硬件流控制和软件流控制1.5、错误检测1.6、串口编程二、串口设备节点介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 串口设备是嵌入式开发中最常用的外设之一,通过串口…

2023年信息科学与工程学院学生科协第一次前端培训

目录 一、前端是什么&#xff1f;前端能做什么&#xff1f;前端需要做什么&#xff1f;现阶段如何理解前端 二、前端学习路线html是什么&#xff1f;css是什么&#xff1f;什么是jshtml、css以及js关系掌握三种语言之后的学习路线 三、HTML基础语法标题段落文本换行文本标签图像…

协程和 C++ Boost库的Coroutine2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 协程和 C Boost库的Coroutine2 摘要为什么不是boost.coroutine&#xff1f; 线程与协程为什么不介绍C20标准的协程C协程与golang的goroutine 二、使用步骤1.引入库2.核心类单…

作为程序员,很多时候容易急眼,如何缓解?

程序员在工作中面临着高压和快节奏的环境&#xff0c;容易因为紧张的工作节奏、复杂的技术问题或与团队的沟通问题而感到焦虑和急躁。下面提供一些策略来帮助缓解这种情况&#xff1a; 1. 定时休息 遵循“番茄工作法”或其他时间管理技术&#xff0c;每工作25分钟后休息5分钟&…

“第四十九天” 机组

各个硬件的工作原理&#xff1a; 主存储器包括&#xff1a;存储体、MAR、MDR&#xff1b; MAR&#xff1a;存储地址寄存器 &#xff0c;MAR的位数反映存储单元的个数&#xff1b; MDR &#xff1a; 存储数据存储器&#xff0c;MDR位数等于存储字长&#xff1b; 数据在存储体…

【Opencv】OpenCV使用CMake和MinGW的编译安装出错解决

编译时出现的错误&#xff1a; mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2 Makefile:161: recipe for target ‘all’ failed mingw32-make: *** [all] Error 2解决方法&#xff1a; 根据贴吧老哥的解答&#xff0c;发现是mingw版本有问题导…

合并有序链表C++递归

题目描述 21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 解题思路 我们这里使用递归的思路来解题&#xff1a; 首先我们要分析题目的子问题在哪&#xff0c;对于这个问题我们先思考如何将两个只有一个节点的有序单链表合并&#xff1a; ①我们可以先判断哪一个…

DCU上如何运行大模型以及用到的docker命令

第一步&#xff1a;需要连接到官方(https://developer.hpccube.com/)提供的vpn 第二步&#xff1a;通过termius进入到项目 第三步&#xff1a;遇到问题 1.docker空间太小了&#xff0c;得换地方&#xff1a;参考这个centos设置docker 目录_mob64ca12f73101的技术博客_51CTO博…

寻找特殊年号

系列文章目录 进阶的卡莎C_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(C…

正点原子嵌入式linux驱动开发——Linux INPUT子系统

按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了input框架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如按键值、坐标等…

python二次开发Solidworks:读取样条曲线数据

目录 1、草图段对象 2、VBA代码分析 3、python代码实现 样条曲线&#xff08;spline curve&#xff09;是数学术语&#xff0c;是一种特殊的参数曲线&#xff0c;由一组控制点通过曲线拟合的方式生成。样条一词源于船舶建造中的一种临时性辅助支架&#xff0c;后来被引入计算…

基于卷的磁盘扫描算法设计

1、设计目的 常规情况下&#xff0c;当我们扫描计算机的硬盘时&#xff0c; 通常会使用诸如FindFirstFile/FindNextFile(Windows)&#xff0c;或者opendir/readdir(Linux)遍历扫描的目录。 一般情形下&#xff0c;由于文件数量相对较少&#xff0c;文件夹层次低&#xff0c;扫…

Hafnium简介和构建

安全之安全(security)博客目录导读 目录 一、Hafnium简介 二、Hafnium构建 2.1.1 先决条件 2.1.1.1 构建Host 2.1.1.2 工具链 2.1.1.3 依赖 2.1.1.4 获取源码 2.1.2 构建 一、Hafnium简介 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现。它为SoC开发人…

MSVCR100.dll丢失修复方法,MSVCR100.dll丢失的解决方法

今天我要和大家分享的是&#xff1a;msvcr100.dll丢失的6种解决方法。 首先&#xff0c;让我们来了解一下msvcr100.dll丢失的原因。msvcr100.dll是Microsoft Visual C 2010的一个组件&#xff0c;它包含了许多运行库文件&#xff0c;这些文件是许多应用程序所必需的。当msvcr1…

TouchGFX界面开发 | 图像控件应用示例

图像控件应用示例 TouchGFX中的图像会绘制关联图像文件中的像素数据。 使用图像文件前&#xff0c;必须将其导入到项目中。TouchGFX Designer内置了五种类型的图像部件&#xff1a; 固定图像&#xff1a;图像大小是由关联的图像文件定义的&#xff0c;不能在运行时改动。若要将…