翻译《The Old New Thing》 - Understanding the consequences of WAIT_ABANDONED

Understanding the consequences of WAIT_ABANDONED - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20050912-14/?p=34253

Raymond Chen 2005年09月12日


理解 WAIT_ABANDONED 的后果

简要

文章讨论了在多线程同步中,如果一个线程在没有释放互斥体(mutex)的情况下退出,互斥体会被操作系统自动释放,这种情况被称为“WAIT_ABANDONED”,并且这种情况可能会导致严重的问题。

正文

        互斥体与其他同步对象的一个重要区别在于,互斥体有所有者。如果拥有互斥体的线程在没有释放互斥体的情况下退出,互斥体会自动代表线程释放。

        但当这种情况发生时,你就遇到大麻烦了。

        许多人忽视的一件事是同步函数(如 WaitForSingleObject)返回的 WAIT_ABANDONED 值。他们通常将其视为成功的等待,因为它确实意味着对象已被获取,但它还告诉你之前的所有者遗弃了互斥体,系统不得不代表所有者释放它。

        当这种情况发生时,你将遇到什么样的大麻烦?

        假设你创建了那个互斥体来保护多个线程在共享对象处于不稳定状态时不对其进行访问。代码进入互斥体,然后开始操作对象,暂时使其处于不稳定状态,但最终使其恢复稳定,并释放互斥体,以便下一个人可以访问该对象。

        例如,你可能有代码管理共享内存中的锚定双向链表,代码如下:

void MyClass::ReverseList() {
 WaitForSingleObject(hMutex, INFINITE);
 int i = 0; // 锚点
 do {
  int next = m_items[i].m_next;
  m_items[i].m_next = m_items[i].m_prev;
  m_items[i].m_prev = next;
  i = next;
 } while (i != 0);
 ReleaseMutex(hMutex);
}

        没有什么特别激动人心,很基本的东西,对吧?

        但如果程序在持有互斥体时崩溃呢?(如果你认为你的程序没有错误,考虑一下程序在运行时网络出现问题,导致页面异常。或者用户只是在这个函数运行时去了任务管理器并终止了你的程序。)

        在这种情况下,操作系统会自动释放互斥体,使链表处于损坏状态。下一个请求互斥体的程序将收到 WAIT_ABANDONED 作为状态码。

        如果你忽略了那个状态码,你最终会在一个损坏的链表上操作。根据链表的使用方式,它可能导致资源泄漏,或者系统意外地创建了某物的第二个副本,甚至可能导致崩溃。一个程序的不幸消亡导致其他程序开始异常行为。

        然而,问题仍然存在,“那么,如果你得到 WAIT_ABANDONED 怎么办?”答案是,“好问题。”

        你可能尝试修复损坏,如果你保留足够的辅助信息来恢复一致的状态。你甚至可以设计你的数据结构为事务性的,这样操纵数据结构的线程的死亡不会使它们处于损坏状态。

        或者你可能决定,由于事情已经损坏,你应该丢弃一切并重新开始,失去了正在进行的工作状态,但至少允许新的工作无阻碍地进行。

        或者你可能会简单地选择忽略错误并继续使用损坏的数据结构,希望无论出了什么问题都不会导致后续的连锁故障。这是大多数人的做法,尽管通常他们甚至没有意识到自己在这么做。而且,由此方法导致的崩溃真的很难调试。

练习:为什么我们在链表数据结构中使用索引而不是指针?

Raymond 目前正在外出;此消息是预录的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【贪心算法】最小生成树Kruskal算法Python实现

文章目录 [toc]问题描述最小生成树的性质证明 Kruskal算法Python实现时间复杂性 问题描述 设 G ( V , E ) G (V , E) G(V,E)是无向连通带权图, E E E中每条边 ( v , w ) (v , w) (v,w)的权为 c [ v ] [ w ] c[v][w] c[v][w]如果 G G G的一个子图 G ′ G^{} G′是…

中国居民消费新特征:中枢回落,即时满足,去地产化

随着收入预期和财富效应的转变,居民更倾向于通过短期集中式的消费来获得即时满足的快乐,服务消费表现出了更强的韧性。服务消费强于商品消费、消费去地产化、汽车挑大梁的特征延续。 特征一:消费倾向高于2020-22年,低于2017-19年…

AI技术赋能下的视频监控方案是如何解决新能源汽车充电难问题的?

一、方案背景 刚刚结束的第十八届北京车展异常火爆,其中一组与汽车有关的数字让人格外关注。根据乘联会2024年4月19日公布的最新数据,全国乘用车市场零售达到51.6万辆,其中新能源车的销量约为26万辆,市场渗透率达到50.39%。 这意味…

如何让CANoe或Wireshark自动解析应用层协议

当我们使用CANoe软件或Wireshark工具抓取以太网总线上的报文时,网卡首先会把以太网总线上的模拟信号解析成以太网帧数据。数据链路层根据二层头部中的Type字段值确定上层的协议。 如果以太网使用的是TCP/IP协议栈,那么Type值要么是0x0800(IPv4),要么是0x0806(ARP),要么是0x…

SOL链DApp智能合约代币质押挖矿分红系统开发

随着区块链技术的不断发展和普及,越来越多的项目开始探索基于区块链的去中心化应用(DApp)。Solana(SOL)作为一条高性能、低成本的区块链网络,吸引了众多开发者和项目,其中包括了各种类型的DApp&…

Ansible自动化工具模块调用与playbook编写

目录 一、Ansible工作机制与特点 (一)Ansible工作机制 1. 初始化与配置 2. 编写Playbook 3. 调用模块 4. 加密敏感数据 5. 执行Playbook 6. 收集执行结果 7. 错误处理与回滚 8. 反馈与报告 (二)Ansible 的主要特点包括…

信锐交换机简介及应用说明(1)

交换机关键参数及分类 1.线速 线速是指交换机的端口上每秒钟传输的bit数,单位为bps(bit per second,即每秒传输多少bit,一个bit也就是一个二进制数0或者1)。以我们常见的例子来说明的话,比如100M的网卡就…

ComfyUI中图像亮度/对比度/饱和度处理

用上面这个节点可以同时设置图片的亮度、对比度和饱和度。 【保姆级教程】一口气分享在ComfyUI中常用的30多种基本图像处理方式 更多好玩且实用AIGC工作流和节点 星球号:32767063 本期资料链接 往期学习资料 整理AI学习资料库

【容器】k8s获取的节点oom事件并输出到node事件

在debug k8s node不可用过程中,有可能会看到: System OOM encountered, victim process: xx为了搞清楚oom事件是什么,以及如何产生的,我们做了一定探索,并输出了下面的信息。(本文关注oom事件是如何生成&传输的&a…

uniapp的app端软件更新弹框

1:使用html PLUS实现:地址HTML5 API Reference (html5plus.org),效果图 2:在app.vue的onLaunch生命周期中,代码如下: onLaunch: function() {let a 0let view new plus.nativeObj.View(maskView, {backg…

mib browser读取mib文件的oid(飞塔防火墙为例)

在配置zabbix监控的时候,配置监控项最为麻烦,一般我们都会套用模板,这种方式比较简单,但是有些设备就是没有现成的zabbix模板,怎么办? 今天我们使用MIB Browser来获取设备SNMP的OID,然后加入zabbix 。 1.什么是MIB Browser SNMP客户端工具MIB Browser, 全名iReasonin…

#LLM入门 | langchain | RAG # 4.3_文档分割

上一章讨论了文档标准化加载,现在转向文档的细分,这虽简单却对后续工作有重大影响。 一、为什么要进行文档分割 模型大小和内存限制:大型GPT模型参数众多,需大量计算和内存,而硬件设备如GPU或TPU有内存限制&#xff…

Vscode 实现代码跳转功能

随笔 目录 1. 安装Python 2. 安装Pylance 3. 选择解释器 1. 安装Python 2. 安装Pylance 3. 选择解释器 到此即可实现跳转功能

Pytorch学习笔记——神经网络基本框架

一、神经网络是什么 神经网络在人工智能和深度学习的领域,一般称为人工神经网络,即ANN(Artificial Neural Network),是一种模仿人脑神经系统工作方式的计算模型。被广泛应用于人工智能、自动控制、机器人、统计学等领域的信息处理中。 二、…

图像处理之PCA(C++)

图像处理之PCA(C) 文章目录 图像处理之PCA(C)前言一、PCA原理1.原理思想2.实现步骤 二、代码实现总结 前言 在科研、工程应用中,我们往往所获取的数据都包含着很多冗余的信息,这些冗余的信息会对我们分析数…

CP AUTOSAR之CANXLDriver详细说明(正在更新中)

本文遵循autosar标准:R22-11 1 简介及功能概述 本规范描述了AUTOSAR 基础软件模块CAN XL 驱动程序的功能、API和配置。   本文档的基础是[1,CiA610-1]和[2,CiA611-1]。假设读者熟悉这些规范。本文档不会再次描述CAN XL 功能。   CAN XL 驱动程序是最低层的一部…

【七十六】【算法分析与设计】2435. 矩阵中和能被 K 整除的路径,87. 扰乱字符串,三维动态规划

2435. 矩阵中和能被 K 整除的路径 给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k 。你从起点 (0, 0) 出发,每一步只能往 下 或者往 右 ,你想要到达终点 (m - 1, n - 1) 。 请你返回路径和能被 k 整除的路径数目,由于答案可能很大…

【Python爬虫实战入门】:全球天气信息爬取

文章目录 一、爬取需求二、所需第三方库2.1 简介 三、实战案例四、完整代码 一、爬取需求 目标网站:http://www.weather.com.cn/textFC/hb.shtml 需求:爬取全国的天气(获取城市以及最低气温) 目标url:http://www.weath…

数字孪生技术在垃圾焚烧处理中的可视化应用

在迈向智慧城市的进程中,数字孪生技术在垃圾处理领域展现出了巨大潜力。特别是在垃圾焚烧过程的管理和优化上,数字孪生垃圾焚烧可视化技术已成为一项革命性的进步。 通过 HT 构建虚拟的垃圾焚烧模型,实时映射和模拟实际焚烧过程中的各项关键…

QT+网络调试助手+TCP服务器

一、UI界面设计 二、单线程 代码设计 1、 查找合法的本地地址&#xff0c;用于当作服务器的IP地址 #include <QThread> #include <QTcpSocket> #include <QNetworkInterface> #include <QMessageBox>QList<QHostAddress> ipAddressesList QNe…