了解 WAIT_ABANDONED 返回值的重要性

news2025/6/18 18:11:26

互斥锁(Mutex)和其他同步对象之间的重要区别之一是:互斥锁具有所有者。如果拥有互斥锁的线程退出而没有释放互斥锁,则互斥锁会自动释放。

但如果发生这种情况,你就有大麻烦了。

许多人忽略的一件事是同步函数(如 WaitForSingleObject)的 WAIT_ABANDONED 返回值。他们通常将此视为成功的等待,因为这确实意味着已获取对象,但它也告诉你这样一个事实:以前的所有者放弃了互斥锁,并且系统必须代表所有者释放它。

当这种情况发生时,你为什么会遇到大麻烦?

一般情况下,我们创建该互斥锁是为了防止多个线程在共享对象处于不稳定状态时访问该对象。代码进入互斥锁,然后开始操作对象,暂时使其不稳定,但最终重新稳定它,然后释放互斥锁,以便下一个人可以访问该对象。

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

>> 请移步至 topomel.com 以查看图片 <<

没有什么特别令人兴奋的事情发生。都是些基本的东西,对吧?

但是,如果程序在持有互斥锁时崩溃怎么办?(如果你认为程序没有错误,请考虑程序通过网络运行并且网络出现故障的可能性,从而导致页面内异常。或者只是用户转到任务管理器并在此函数运行时终止了程序。)

在这种情况下,操作系统会自动释放互斥锁,使链表处于损坏状态。下一个声明互斥锁的程序将接收WAIT_ABANDONED 作为状态代码。如果忽略该状态代码,则最终会在损坏的链表上运行。根据该链表的使用方式,它可能会导致资源泄漏或系统创建某些内容的意外第二个副本,甚至可能崩溃。一个程序的不幸消亡导致其他程序开始表现奇怪。

然后,问题仍然存在。”那么,如果你得到 WAIT_ABANDONED,你会怎么做?” 答案是:好问题。

如果保留足够的辅助信息以恢复一致状态,则可以尝试修复损坏。你甚至可以将数据结构设计为事务性结构,以便操作数据结构的线程的死亡不会使它们处于损坏状态。或者你可能只是决定,既然对象已经损坏,你应该扔掉所有东西,重新开始,失去正在进行的工作的状态,但至少允许新工作不受阻碍地进行。

或者,你可以简单地选择忽略错误并继续使用损坏的数据结构,希望出现的任何错误都不会导致级联故障。这是大多数人所做的,尽管通常甚至没有意识到他们正在这样做。而且很难调试这种方法导致的崩溃。

课后练习题

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

总结

一般我在使用 WaitForSingleObject 时,只会使用 WAIT_OBJECT_0 和 WAIT_TIMEOUT 这两个返回值。从今天的文章中,我们应该有所警示:这个函数还可能返回 WAIT_ABANDONED,如果你的代码里没有考虑到这种情况,则当事情发生的时候,程序可能表现的有些异常,且很难定位问题点。
这就是上文所说的大麻烦。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Understanding the consequences of WAIT_ABANDONED》

 

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

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

相关文章

如何写一个优质高效的网络项目实施方案?这篇文章值得收藏!

随着互联网技术的不断发展&#xff0c;网络项目的实施成为了许多企业和组织的重要任务。网络项目实施方案是指在进行网络项目实施时&#xff0c;为了保障项目的顺利进行&#xff0c;达到项目目标和交付要求&#xff0c;所制定的详细计划和操作指南。一个好的网络项目实施方案对…

数据结构 - 快排 | C

目录快速排序①hoare版本思路分析代码实现时间复杂度<整体优化><局部优化>②挖坑法思路分析代码实现③前后指针法思路分析代码实现④非递归快排思路分析代码实现以上代码汇总快速排序 ①hoare版本 思路分析 以上图为例&#xff1a; 指定一个数为a[key] 6&#x…

使用大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据

记录一下使用Java的SpringBoot大华SDK在智慧公厕项目中使大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据 首先根据说明书登录摄像头&#xff0c;一般摄像头都有自己的账号和密码(可能是admin admin 也可能是admin 888888 还有可能是admin 12345)&#xff0c;…

VMware ESXi 7.0 U3l Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-03-31&#xff0c;发布 ESXi 7.0U…

C++轻量级Web服务器TinyWebServer源码分析之log篇

文章目录log日志篇简介一、日志类的定义与使用二、单例模式与阻塞队列的定义1、单例模式2、阻塞队列log日志篇简介 使用单例模式创建日志系统&#xff0c;对服务器运行状态、错误信息和访问数据进行记录&#xff0c;该系统可以实现按天分类&#xff0c;超行分类功能。其中异步…

RabbitMq图形界面创建队列操作步骤及控制台使用说明

版本&#xff1a;RabbitMQ 3.9.7 控台台访问路径&#xff1a; http://localhost:15672/#/queues 使用控制台创建队列 登录 创建队列 &#xff08;1&#xff09;输入自定义的队列名称 &#xff08;2&#xff09;其他输入参数为默认值即可 &#xff08;3&#xff09;点击【Add…

雷蛇灵刃18 2023原厂预装出厂Windows11系统

雷蛇系统安装完自带所有机型驱动和软件&#xff0c;并重建隐藏分区&#xff0c;还原功能 文件地址: https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 支持系列: 雷蛇灵刃16 2023 [RZ09-0483]Windows11原厂系统 雷蛇灵刃 Stealth 13 Base Model [RZ09-0310] 201…

【Unity VR开发】结合VRTK4.0:创建一个按钮(Option Button)

语录&#xff1a; 如同天上降魔主&#xff0c;真是人间太岁神。 前言&#xff1a; 选项按钮是一种提供多项选择选项的方法&#xff0c;其中只有一个按钮可以处于激活状态&#xff0c;激活另一个按钮时将确保组中的所有其他按钮都已停用。我们可以使用嵌套在预制件中的预制件来实…

ChatGPT将引发大量而普遍的网络安全隐患

ChatGPT是一个基于人工智能的语言生成模型&#xff0c;它可以在任何给定的时间&#xff0c;使用自然语言生成技术&#xff0c;生成文本、对话和文章。它不仅可以被用来编写文本&#xff0c;还可以用来编写语言、生成图像和视频。目前&#xff0c; ChatGPT已广泛应用于语言翻译、…

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解 超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA&#xff0c;采用先进的封装技术&#xff0c;能让每个元件达到最低成本。此系列采用最新的小型封装&…

RK3399平台开发系列讲解(基础篇)Linux 传统间隔定时器

🚀返回专栏总目录 文章目录 一、设置间隔定时器 setitimer()二、查询定时器状态 getitimer()三、更简单的定时接口 alarm()四、传统定时器的应用4.1、为阻塞操作设置超时4.2、性能剖析五、传统定时器的局限性沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将详细…

java 泛型 万字详解(通俗易懂)

目录 一、前言 二、为什么需要泛型&#xff1f; 三、什么是泛型&#xff1f; 1.泛型的定义 : 2.泛型的作用 : 四、怎么用泛型&#xff1f; 1.泛型的语法 : 2. 泛型的使用 : 3.自定义泛型类 : 1 基本语法 : 2 使用细节 : 4.自定义泛型接口 : 1 基本语法 : 2 使用细…

C++-继承

继承继承的基本概念继承的概念继承的定义继承的格式继承的方式继承基类成员访问方式的变化基类与派生类的对象赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承中的静态成员菱形继承菱形虚拟继承继承的总结继承的基本概念 继承的概念 继承机制是面向对象程序设计中…

【Spring源码】 BeanFactory和FactoryBean是什么?

1、前言 面试官&#xff1a;“看过Spring源码吧&#xff0c;简单说说Spring中BeanFactory和FactoryBean的区别是什么&#xff1f;” 大神仙&#xff1a;“BeanFactory是bean工厂&#xff0c;FactoryBean是工厂bean”。 这么回答&#xff0c;等于面试官问你Spring是什么&…

如何免费使用ChatGPT 4?

自从ChatGPT发布以来&#xff0c;它就取得了巨大的成功。无论是常春藤法学考试还是商学院作业&#xff0c;ChatGPT都被用于各种试验。统计数据显示&#xff0c;ChatGPT每月吸引约9600万用户。随着ChatGPT的巨大成功&#xff0c;Open AI最近推出了它的最新版本&#xff0c;名为“…

Learning to Detect Human-Object Interactions 文章解读

Learning to Detect Human-Object Interactions&#xff0c;WACV&#xff0c;2018 论文下载 code&#xff1a;http://www.umich.edu/∼ywchao/hico/ 摘要 主要研究领域&#xff1a;定义了HOI detection任务&#xff1a;在静态图像中检测人-对象交互&#xff08;HOI&#xff…

Vue路由模式为history的项目部署到Nginx

前言 对于前端工程师而言&#xff0c;多多少少会碰到按需加载的需求。 比如一个系统&#xff0c;需要用户登陆以后才能使用&#xff0c;对于传统的前后端未分离的情况&#xff0c;我们一般的处理方式是&#xff0c;当检测到用户未登录的时候&#xff0c;一般会重定向到登录页面…

JVM运行时数据区的必备知识:Java程序员不容错过

1、JVM运行时数据区概念 JVM运行时数据区是Java虚拟机在执行Java程序时所使用的内存区域。这些区域包括了以下几个部分&#xff1a; 程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a;程序计数器是一块较小的内存区域&#xff0c;它可以看作是当前线程…

测试1号位的自我修养

作者&#xff1a;京东零售 吴聪 引言 目前京东实行BigBoss机制以及积木型组织&#xff0c;同时现阶段再次强调了“经营”理念&#xff0c;以上均是比较大的组织层面的纲领和引导&#xff0c;核心是为了激发大家owner意识可以更好更快为公司产出价值和贡献。落到具体执行层面&…

国内大模型领域进入乱战时代

国内大模型领域进入乱战时代 2023.4.12版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 什么是大模型 大模型&#xff0c;又称为预训练模型、基础模型等&#xff0c;是指模型参数数量很大&#xff0c;需要大量计算资源才能训练的深度学习…