调用 LeaveCriticalSection 出现无效句柄异常

从内部的视角看,一个临界区是一套计数器和标志位的集合,也可能是一个事件对象。
(请注意,临界区的内部结构随时可能更改,事实上,它在 Windows XP 和 Windows 2003 之间发生了变化。因此,此处提供的信息仅用于故障排除和调试目的,不用于生产用途。)

只要没有争用,计数器和标志位就足够了,因为没有人必须等待临界区(因此,当临界部分区时,没有人必须被唤醒)。

如果一个线程需要被阻塞,因为它锁定的临界区已经被另一个线程拥有,内核会为临界区创建一个事件(如果还没有),并等待它。

当临界区的所有者最终释放它时,会激发该事件的信号,从而提醒所有等待的线程:”关键部分现在可用”,他们应该尝试再次锁定它。(如果有多个等待线程,则只有一个线程将实际进入临界区,其他人将继续等待。)

如果在 LeaveCriticalSection 中收到无效的句柄异常,则表示临界区的代码认为有其他线程在等待临界区可用,因此它尝试发出事件信号,但事件句柄处于无效状态。

现在,请先思考一下,为什么会这样。

一种可能性是,临界区内存已被破坏,并且通常保存事件句柄的内存已被其他一些恰好不是有效句柄值覆盖。

另一种可能性是,其他一些代码段将未初始化的变量传递给 CloseHandle 函数,并最终错误地关闭了临界区的句柄。如果其他代码段存在双重关闭错误,并且句柄(现已关闭)恰好被重用作临界区的事件句柄,也会发生这种情况。当有缺陷的代码第二次错误地关闭句柄时,它最终会关闭临界区的句柄。

当然,问题可能是临界区无效,因为它从一开始就没有被正确地初始化过。字段中的值只是未初始化的垃圾,当你尝试离开此未初始化的临界区时,该垃圾将用作事件句柄,从而引发无效句柄异常。

话又说回来,问题可能是临界部分无效,因为它已经被销毁了。例如,一个线程可能具有如下代码:

EnterCriticalSection(&cs);
… do stuff…
LeaveCriticalSection(&cs);

当该线程忙于执行操作时,另一个线程会调用 DeleteCriticalSection(&cs)。这会破坏临界区,而另一个线程仍在使用它。最终,该线程完成其操作并调用 LeaveCriticalSection,这会引发无效句柄异常,因为 DeleteCriticalSection 已关闭句柄。

所有这些都是 LeaveCriticalSection 中出现无效句柄异常的可能原因。要确定你遇到的是哪一个,需要更多的调试,但至少现在你知道要寻找什么。

总结

临界区必须成对进行操作,且需要考虑某些异常导致的代码提前跳出正常执行路径,而造成的不能成对调用的情况。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What does an invalid handle exception in LeaveCriticalSection mean?》

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将 Docsify 项目部署到 CentOS 系统的 Nginx 中?

文章目录 1. 介绍2. 准备工作3. 将 Docsify 项目上传至服务器4. 在服务器上安装 Node.js5. 在服务器上运行 Docsify6. 配置 Nginx 反向代理7. 访问 Docsify 文档8. 拓展8.1 配置 HTTPS8.2 定制 Docsify 主题8.3 鉴权和访问控制 🎉如何将 Docsify 项目部署到 CentOS …

java“俄罗斯方块”

首先新建议一个包为Tetris (俄罗斯方块) 类名也叫做Tetris; 代码运行: package Tetris; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.aw…

高性能音乐流媒体服务Diosic

什么是 Diosic ? Diosic 是一个开源的基于网络的音乐收集服务器和流媒体。主要适合需要部署在硬件规格不高的服务器上的用户。Diosic 是使用 Rust 开发的,具有低内存使用率和高性能以及用于流媒体音乐的非常干净的界面。 安装 在群晖上以 Docker 方式安装。 在注…

C/C++高频面经-秋招篇

自己在秋招找工作过程中遇到的一些C/C面试题,大中小厂都有,分享出来,希望能帮到有缘人。 C语言 snprintf()的使用 函数原型为int snprintf(char *str, size_t size, const char *format, …) 两点注意: (1) 如果格式化后的字符…

Mac安装win程序另一个方案

前言 今天跟大家分享的是mac装win程序的另一个思路,不需要大动干戈的装双系统、虚拟机。最后分享感受,先说过程吧。 一、思路介绍 其实,就是利用CrossOver,这个软件的介绍大家可以自行了解。不过不得不说这玩意还是国外的人思路新…

vmware17 虚拟机拷贝、备份、复制使用

查看新安装的虚拟机位置 跳转到上一级目录 复制虚拟机 复制虚拟机整个目录 删除lck文件,不然开机的时候会报错 用vmware 打开新复制的虚拟机 lck文件全部删除 点击开机 开机成功

Python接口自动化(什么是接口、接口优势、类型)

简介 经常听别人说接口测试,接口测试自动化,但是你对接口,有多少了解和认识,知道什么是接口吗?它是用来做什么的,测试时候要注意什么?坦白的说,笔者之前也不是很清楚。接下来先看一下…

各类好玩免费API推荐,早知道就不用到处爬数据了...

啥是API/接口? 使用方法 API平台 淘宝/京东API接口数据 一些好玩的api 地图接口 天气查询接口 快递查询接口 笔记接口 其它接口 小结 啥是API/接口? 有些读者刚开始学习编程遇到API或者接口不太明白到底什么意思,没关系&#xff0…

unity 烘焙的时候出现模型没有光影的情况

unity 烘焙的时候出现模型没有光影的情况 1.模型没有设置生成光照贴图 需要勾选模型的生成光照贴图UVs,然后应用 2.游戏对象没有勾选静态选项 点开静态下拉列表,选择 contribute GI

专业数据标注公司:景联文科技领航数据标注行业,满足大模型时代新需求

随着大模型的蓬勃发展和相关政策的逐步推进,为数据要素市场化配置的加速推进提供了有力的技术保障和政策支持。数据要素生产力度的不断提升,为数据标注产业带来了迅速发展的契机。 根据国家工信安全发展研究中心测算,2022年中国数据加工环节的…

JAVAEE初阶 操作系统

操作系统的相关知识 一.操作系统的定位二.操作系统的作用三.什么是进程/任务1.进程在系统中如何操作和管理 四.PCB中的核心属性1.pid2.内存指针3.文件描述符表 五.CPU1.cpu的特性:分时复发 六.PCB中进行调度的属性1.状态2.优先级3.记账信息 一.操作系统的定位 二.操作系统的作用…

观测云产品更新 | 监控、图表、服务管理、单点登录、Pipeline 等优化

观测云更新 监控相关的若干使用优化 1.【告警沉默】功能回归,您仍可以通过告警沉默配置定义重复告警通知的时间间隔。 2.【监控器】删除 ”紧急“、”重要“、”警告“触发条件必须配置任意一项的限制,您可任意配置”紧急“、”重要“、”警告“、”无…