C++那些事之helgrind并发编程检测

news2024/11/15 21:43:45

C++那些事之helgrind并发编程检测

大纲

  • 死锁

  • 数据竞争

  • 提问

通常我们在写多线程程序的时候很容易遇到两个问题:

  • 死锁了,不知道什么原因导致

  • 数据不一致,多个线程没保护数据

那么有没有工具来检测这两种场景呢

答案是有的,我们可以使用valgrind的helgrind工具检测这两个问题,为了使本文讲解的更加丝滑,引出了几个例子。

注:完整示例及修复示例已更新至星球。

死锁

假设有两个线程互相持有对方的锁,此时我们可以模拟出死锁,例如:

void thread_func1() {
    std::lock_guard<std::mutex> lock1(mutex1);
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    std::lock_guard<std::mutex> lock2(mutex2);
}

void thread_func2() {
    std::lock_guard<std::mutex> lock2(mutex2);
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    std::lock_guard<std::mutex> lock1(mutex1);
}

helgrind使用的方法如下:

valgrind --tool=helgrind ./a.out

此时我们可以看到死锁的位置,例如这个示例中指出了两个线程在对应位置发生了死锁

thread_func2() (deadlock.cc:18)
thread_func1() (deadlock.cc:12)

ee99a6a0eb3a197a84536fb94eb42261.jpeg

数据竞争

假设有一个共享变量,我们在多线程对它增加10w次,这个结果是多少呢?

很明显这里产生了多线程竞争全局变量的问题,最终的结果不一致,使用helgrind检测方法同上。

int shared_var = 0; 

void increment() {
    for (int i = 0; i < 100000; ++i) {
        ++shared_var; 
    }
}

此时,我们可以看到data race的行数是哪一行,然后去解决问题。

a5cd6d58d86e328871f2bcae340a4ebe.jpeg

最后,留几个问题吧:

1.上面这两个有问题的代码,如何修复?

2.除了上面工具,还有其他办法?

本节完

揭秘答案,戳下方呀~

ef603d2f1e31f75d86664abd68f7373c.jpeg

往期推荐:

向量数据库milvus源码剖析之开篇

热度更新,手把手实现工业级线程池

玩转cpp小项目星球3周年了!

91ce6c096dda55baf5e384df65e9a1ad.jpeg

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

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

相关文章

【Qt】常用控件QProgreeBar

常用控件QProgreeBar 使用QProgressBar表示一个进度条&#xff01;&#xff01;&#xff01; QProgressBar的核心属性 属性说明 minimum 进度条最⼩值 maximum 进度条最⼤值 value 进度条当前值 alignment ⽂本在进度条中的对⻬⽅式. Qt::AlignLeft : 左对⻬Qt::Align…

Unity(2022.3.38LTS) - 性能分析器

目录 一. 简介 二. 打开分析器 1. 打开 2.在目标平台上分析应用程序 三. 分析分析器 四. 模块详细介绍 1.Asset Loading Profiler 模块 2.Audio Profiler 模块 3.CPU Usage Profiler 模块 4.File Access Profiler 模块 5.Global Illumination Profiler 模块 6.GPU …

多线程任务中设置MDC的实践

多线程任务中设置MDC的实践 引言 在当今的软件开发中&#xff0c;日志记录是不可或缺的一部分。日志不仅仅是调试工具&#xff0c;还在系统监控、性能分析、故障排除中扮演着关键角色。尤其在多线程环境中&#xff0c;日志的上下文信息一致性至关重要。MDC&#xff08;Mapped…

WPF 动画 插值动画、关键帧动画、路径动画

WPF动画&#xff0c;分为三种&#xff1a;插值动画、关键帧动画、路径动画 2.1 插值动画&#xff1a;     1&#xff09;定义&#xff1a;插值动画是指&#xff0c;属性值从某一个值&#xff0c;经过一段时间后&#xff0c;连续变化值另一个值的动画。         例…

订单到期关闭如何实现?

目录 一、被动关闭 二、定时任务 三、JDK自带的DelayQueue 四、Netty的时间轮 五、Kafka的时间轮 六、RocketMQ延迟消息 七、RabbitMQ死信队列 八、RabbitMQ插件 九、Redis过期监听 十、Redis的Zset 十一、Redisson 在电商、支付等系统中&#xff0c;一般都是先创建…

win/mac数字资产管理软件Adobe Bridge (BR)软件下载安装

目录 一、Adobe BR软件介绍 1.1 软件概述 1.2 主要功能 1.3 系统要求 二、Adobe BR安装步骤 2.1 下载软件 2.2 安装前准备 2.3 安装过程 三、Adobe BR使用教程 3.1 基础操作 3.1.1 浏览与预览 3.1.2 搜索与筛选 3.1.3 批量操作 3.2 进阶功能 3.2.1 元数据管理 …

鸿蒙OS高级应用开发例题

44项目需要同时进行应用和元服务的开发&#xff0c;并针对当前项目工程中的代码可以分别构建出应用和元服务的包&#xff0c;如何在DevEco Studio中设置不同的构建配置&#xff0c;达成这个目的 A. 在模块级别buld-pronlejson5定义两个target;将两个target的bundleType分别设置…

8.20模拟赛题解

简单点评一下 整体上来看 &#xff0c;A题拿满分的同学可能占一半吧 &#xff0c;这个数据其实是不太理想的 &#xff0c;说明同学们对于思维模拟题还是不熟练&#xff0c;没抓住题目要分析的本质。 B题显然是保证有解的&#xff0c;有解的情况下问最优解&#xff0c;说明翻到满…

动力电池系统面向开发的测试——电池阻抗特性测试(下)

接动力电池系统面向开发的测试——开路电压测试&#xff08;上&#xff09;本文主要围绕BMS设计中的等效电路模型第二大动态特性参数——阻抗特性及测试内容来展开分享。 阻抗特性测试方法&#xff1a; 方案1&#xff1a;直流脉冲测试 前面在分享功率评估内容的时候&#xf…

【正点原子K210连载】第三十二章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第三十二章 音频FFT实验 本章将介绍CanMV下FFT的应用&#xff0c;通过将时域采集到的音频数据通过FFT为频域。通过本章的学习&#xff0c;读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节&#xff1a; 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…

How can OpenAI Gym‘s visualizations work within Docker?

题意&#xff1a;OpenAI Gym 的可视化功能如何在 Docker 中运行&#xff1f; 问题背景&#xff1a; Id like to get OpenAI Gym working with the rendered OpenGL visualizations within a docker container. 我想在 Docker 容器中让 OpenAI Gym 与渲染的 OpenGL 可视化一起…

数据通信基础

信道特性 信道带宽 W 模拟信道&#xff1a;WF max - F min &#xff08;信道最大频率减去最小频率&#xff0c;单位Hz&#xff09; 数字信道&#xff1a;数字信道是离散信道&#xff0c;带宽为信道能够达到的最大数据传输速率&#xff0c;单位bit/s 奈奎斯定理&#xff08;理…

IOy系列BL196MQTT远程IO模块智能农业灌溉水质监测

随着农业科技的进步和智能农业的发展&#xff0c;传统的灌溉和水质管理方式正逐渐被更为高效和智能的解决方案所取代。在智能农业系统中&#xff0c;水质监测作为灌溉管理的关键环节&#xff0c;对保障作物健康和提高水资源利用效率具有重要作用。 IOy系列BL196 MQTT远程IO模块…

第七届机械、控制与计算机工程国际学术会议(ICMCCE2024)

第七届机械、控制与计算机工程国际学术会议定于2024年10月25日至27日在中国杭州召开。本届会议由巢湖学院主办&#xff0c;主要围绕“机械”、“控制”与“计算机工程”等研究领域展开讨论。旨在为机械、控制与计算机工程方面的专家学者及企业发展人提供一个分享研究成果、讨论…

iML6602是一款60W立体声Class-D音频功率放大器集成电路

音频放大器是在产生声音的输出元件上重建输入的音频信号的设备&#xff0c;其重建的信号音量和功率级都要理想&#xff1a;如实、有效且失真低。音频范围为约20Hz&#xff5e;20000Hz&#xff0c;因此放大器在此范围内必须有良好的频率响应&#xff08;驱动频带受限的扬声器时要…

Flink常见数据源使用教程(DataStream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

深度deepin v23系统也能玩《黑神话:悟空》 8GB内存、GTX 1660 Ti丝滑流畅

首款国产现象级3A游戏《黑神话&#xff1a;悟空》正式上线&#xff0c;有玩家将其比喻为“村里这么多年终于出个大学生了”…那么&#xff0c;在国产操作系统上可以畅玩《黑神话&#xff1a;悟空》吗&#xff1f;答案是肯定的。深度系统最新版本deepin v23就展示了一番。 当然&…

最短路径树,CF 1076D - Edge Deletion

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1076D - Edge Deletion 二、解题报告 1、思路分析 考虑dijkstra实际上是…

如何将MySQL迁移到TiDB,完成无缝业务切换?

当 MySQL 数据库的单表数据量达到了亿级&#xff0c;会发生什么&#xff1f; 这个现象表示公司的业务上了一个台阶&#xff0c;随着数据量的增加&#xff0c;公司规模也进一步扩大了&#xff0c;是非常喜人的一个改变 &#xff0c;然而随之而来的其他变化&#xff0c;就没那么…

【踩坑】如何解锁微软“已暂时锁定你的帐户”

登录微软账号时候&#xff0c;提示&#xff1a;有人在使用此帐户时输入错误密码的次数过多。为了保证帐户安全&#xff0c;我们已暂时锁定你的帐户&#xff0c;请稍后再试。 进入以下网站重置密码即可&#xff1a; https://account.live.com/ResetPassword.aspx?mktzh-CN 登录…