Win7下静态变量析构导致进程卡死无法退出问题解决

news2024/11/19 22:39:20

项目中在用户机器Win7系统上好几次出现进程卡死,无法退出,在用户机器上抓取了dump,发现是在DllMain函数中执行了静态变量的析构,这个静态变量析构的时候会使用std::condition_variable 类型的成员变量通知其他线程退出。同时本地在win10机器上并不会出现。

最开始一直没查到原因,解决方法是在main函数退出之前就把静态变量反初始化函数执行,这样在DllMain中就只是一个空的析构函数,不会导致卡死了。

卡死dump截图:

当时我给的建议是,尽量不要在DllMain中执行很多同步逻辑,因为官方的最佳实践文档中给了出的建议也是这样:

https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-best-practices

第三条很明确的说了,不要和其他线程做同步的事情。

(备注:第一条曾经也遇到过这类死锁的dump,调用com组件的时候有时候会加载动态库,从而导致死锁。关键字:Loader Lock) 

一年之后又遇到了一个无法退出的case,我给用户远程并抓取了dump,发现还是类似的问题,只不过代码是在另外一个地方。

上次是我同事发现的这个问题,想办法绕过去了,这次我想弄明白原因,在网上查了一些资料,google查找的关键字:ZwReleaseKeyedEvent deadlock,因为堆栈最后一个函数是这个。

发现了很有价值的两篇文章:

第一篇:

https://stackoverflow.com/questions/60452341/stdconditional-variable-notify-problem-on-windows-7-called-from-destructor-oz​​​​​​​z​​​​​​​f

这篇文章这个人也遇到了,代码和我们的代码几乎一样:

class SomeObject
{
public:
    ~SomeObject()
    {
        StopThreadAndWait();
    }
    
    void StopThreadAndWait()
    {
            /* some logic  */
            m_stop = true;
            m_procesTasks.notify_one(); // <- the problem is here
            
            if (m_thread.joinable())
                m_thread.join();
    }
    
private:
    ...
    bool        m_stop;
    std::mutex  m_workQueueSync;
    
    std::thread m_thread;
    std::condition_variable m_procesTasks;
};

第二篇:

https://bugzilla.mozilla.org/show_bug.cgi?id=970063 

也就是说mozilla也遇到过这个问题,并且还给出了问题的答案,答案之一就是安装补丁,因为这个是windows系统的bug:

 

 补丁链接:

A process that is being terminated stops responding in Windows 7 or in Windows Server 2008 R2 - Microsoft Support

上面说明了只在win7 和 Windows Server 2008 R2 系统上会出现此问题。

到此,整个问题已经查明原因了。

但是,用户那里环境我们几乎是不能改变的,比如给用户安装这个补丁似乎成本很大。所以我们 就修改我们自己的代码,不要在DllMain中因为析构静态变量,执行了 std::condition_variable::notify_one(all)之类的函数,放到main函数退出之前执行即可。

第一篇文章中使用boost库中的condition_variable类也可以解决。同时我也把我发现的这个问题写在了这篇文章的评论中了。

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

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

相关文章

PDF怎样转换成长图?这个方法,超级简单!

在当今社会&#xff0c;PDF文档广泛应用于各个领域。然而&#xff0c;在某些情况下&#xff0c;我们可能需要将多个PDF页面合并成一个单独的长图&#xff0c;以便更方便地浏览、共享或嵌入到其他文件中。为了满足这一需求&#xff0c;记灵在线工具应运而生&#xff0c;它为我们…

一种全新的图像变换理论的实验(六)——研究目的替代DCT和小波

一、变换算法在图像视频中的核心作用 我们国产的变换算法是比较少的&#xff0c;基本上都是在小波、DCT和FFT上发展优化升级的应用。我之前的文章给出了一种基于加权概率模型的变换算法&#xff0c;该算法在一定的程度上能有效的保存低频数据。而且我基于该算法给出了一些新的…

微信小程序快速开发— TDesign模版初始化

最近有个商城类的小程序业务需要快速上线&#xff0c;看了一下微信官方的模版库&#xff0c;相中了TDesign&#xff0c;调研了半天&#xff0c;决定就从这个开始干。 调研的两个重点&#xff1a; 1、网络请求&#xff0c;即数据获取 2、模板本身存在些bug&#xff0c;如&…

从Kotlin中return@forEach了个寂寞

点击上方蓝字关注我&#xff0c;知识会给你力量 今天在Review&#xff08;copy&#xff09;同事代码的时候&#xff0c;发现了一个问题&#xff0c;想到很久之前&#xff0c;自己也遇到过这个问题&#xff0c;那么就来看下吧。首先&#xff0c;我们抽取最小复现代码。 (1..7).f…

Python 基于人脸识别的实验室智能门禁系统的设计与实现,附源码

1 简介 本基于人脸识别的实验室智能门禁系统通过大数据和信息化的技术实现了门禁管理流程的信息化的管理操作。平台的前台页面通过简洁的平台页面设计和功能结构的分区更好的提高用户的使用体验&#xff0c;没有过多的多余的功能&#xff0c;把所有的功能操作都整合在功能操作…

聚观早报|微软Xbox2023发布会汇总;苹果VisionPro头显低配版曝光

今日要闻&#xff1a;微软Xbox 2023发布会汇总&#xff1b;苹果Vision Pro头显低配版曝光&#xff1b;台积电在熊本县建设半导体工厂&#xff1b;苹果今年或能出货2.4亿台&#xff1b;中国含氯废塑料高效无害升级回收 微软Xbox 2023发布会汇总 6 月 12 日凌晨&#xff0c;微软…

Java 实战介绍 Cookie 和 Session 的区别

HTTP 是一种不保存状态的协议&#xff0c;即无状态协议&#xff0c;HTTP 协议不会保存请求和响应之间的通信状态&#xff0c;协议对于发送过的请求和响应都不会做持久化处理。 无状态协议减少了对服务压力&#xff0c;如果一个服务器需要处理百万级用户的请求状态&#xff0c;对…

Linux教程——Linux绝对路径和相对路径详解

在 Linux 中&#xff0c;简单的理解一个文件的路径&#xff0c;指的就是该文件存放的位置&#xff0c;只要我们告诉 Linux 系统某个文件存放的准确位置&#xff0c;那么它就可以找到这个文件。 指明一个文件存放的位置&#xff0c;有 2 种方法&#xff0c;分别是使用绝对路径和…

深度解读 KaiwuDB 的排序操作

一、单节点执行 在单节点环境执行一条简单的 SQL 语句 SELECT * FROM NATION ORDER BY N_NAME。NATION 是一张小表&#xff0c;只有 25 条记录&#xff1b;对第 2 列 N_NAME 进行升序排列。 1. 抽象语法树 上述示例中的 SQL 语句经过分析器解析后得到 AST&#xff0c;如下图…

(文章复现)面向配电网韧性提升的移动储能预布局与动态调度策略(2)-灾后调度matlab代码

参考文献&#xff1a; [1]王月汉,刘文霞,姚齐,万海洋,何剑,熊雪君.面向配电网韧性提升的移动储能预布局与动态调度策略[J].电力系统自动化,2022,46(15):37-45. 1.基本原理 1. 1 目标函数 在灾害发生后&#xff0c;配电网失去主网供电&#xff0c;设故障的持续时间可根据灾害…

基于SpringBoot+Vue的酒店管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

代码随想录 二叉树 Java(二)

文章目录 &#xff08;*中等&#xff09;222. 完全二叉树的节点个数&#xff08;*简单&#xff09;110. 平衡二叉树&#xff08;*简单&#xff09;257. 二叉树的所有路径&#xff08;简单&#xff09;404. 左叶子之和&#xff08;简单&#xff09;513. 找树左下角的值&#xff…

设计模式的原则(一)

相信自己&#xff0c;无论自己到了什么局面&#xff0c;请一定要继续相信自己。 新的世界开始了&#xff0c;接下来&#xff0c;老蝴蝶带领大家学习一下设计模式。 我们先了解一下 设计原则 一.设计模式 一.一 设计原则 设计模式常用的七大原则: 单一职责原则接口隔离原则…

【项目】接入飞书平台

前言 项目有和飞书打通的需求&#xff0c;因为是第一次打通&#xff0c;摸索过程还是花了些时间的&#xff0c;现在相关笔记分享给大家。 步骤 1、熟悉开发文档 熟悉飞书的开发文档&#xff1a;开发文档 &#xff0c;找到你需要的接口&#xff0c;拿我为例&#xff0c;我需…

长生的秘密:肠道菌群代谢组学

欲遂长生志&#xff0c;但求千金方。长生不老是人类文明历程中苦苦追寻的目标之一&#xff0c;影响人类寿命的因素也复杂多样&#xff0c;包括但不限于遗传因素如性别、线粒体状态、染色体稳定性、端粒长短、疾病、干细胞活性&#xff1b;环境因素如肠道微生物、饮食、运动、空…

如何解决“RuntimeError: CUDA Out of memory”问题

当遇到这个问题时,你可以尝试一下这些建议,按代码更改的顺序递增: 减少“batch_size” 降低精度 按照错误说的做 清除缓存 修改模型/训练 在这些选项中,如果你使用的是预训练模型,则最容易和最有可能解决问题的选项是第一个。 修改batchsize 如果你是在运行现成的代码或…

页面置换算法的模拟与比较

前言 在计算机操作系统中&#xff0c;页面置换算法是虚拟存储管理中的重要环节。通过对页面置换算法的模拟实验&#xff0c;我们可以更深入地理解虚拟存储技术&#xff0c;并比较不同算法在请求页式虚拟存储管理中的优劣。 随着计算机系统和应用程序的日益复杂&#xff0c;内存…

技术管理方法论

今天来跟大家分享一下我对于技术管理的理解。先介绍一下对于管理最普遍的认识&#xff0c;我们每一个人在公司里面都有两种类型的角色&#xff0c;一种是通过个人的能力和产出来实现组织利益的最大化&#xff0c;另外一类人就是通过管理使得一群人产出结果最大化。 也就是我们…

阿里P8传授的80K+星的MySQL笔记助我修行,一周快速进阶

MySQL 是最流行的关系型数据库之一&#xff0c;广泛的应用在各个领域。下面这些问题对于程序员的你来说应该很常见&#xff0c;来看看你面对这些问题是否会胆怯? MySQL数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f; …

Linux防火墙学习笔记8

iptables的白名单和黑名单&#xff1a; iptables -t filter -I INPUT -s 192.168.2.20 -p tcp --dport 80 -j DROP 之前内网的机器可以访问到80端口&#xff0c;现在添加了这条规则&#xff0c;那么就192.168.2.10这个用户就不能访问了。 案例&#xff1a;白名单&#xff1a;…