首页 > 解决方案 > VS 控制台中的应用程序验证程序报告和错误:删除具有无效锁定计数的关键部分

问题描述

我打开了 appverif.exe,将我的二进制文件添加到列表中并启用了“基础”测试。保存更改后,我使用 Visual Studio 在调试模式下打开了应用程序。更准确地说,我首先启动了该服务(该应用程序是一个作为 SYSTEM 运行的服务,因此我需要稍后附加它),然后我将 VS 调试器附加到该进程。

有时应用程序会在之后崩溃,DeleteCriticalSection并在 VS 控制台窗口中显示以下消息:

VERIFIER STOP 00000208 - Deleting critical section with invalid lock count
    05AAEB48 : Critical section address. Run !cs -s <address> to get more information.

我想这意味着该CRITICAL_SECTION变量已被删除,而另一个线程对其进行了锁定。那是对的吗 ?

怎样才能避免这样的问题?

我知道理想的工具是引用计数器,这样只有拥有对指针的最后一个引用的人才能删除对象。这已经在 C++11 及更高版本中实现,但不是在纯 C 中实现。

缓解措施可能是注册第一次使用该变量的每个线程。当一个线程想要删除变量时,它首先检查队列是否仅包含其 id,如果是这种情况,则删除完成,否则要求队列中的最后一个线程。当然,该变量可能仍被从未使用过的线程使用,因此该线程尚未注册到队列中,仍然可以调用EnterCriticalSection该变量并导致崩溃。另一个问题是您需要使用另一个变量来保护队列访问(至少是写访问),CRITICAL_SECTION因此您只是将问题从一个变量转移到另一个变量。

任何想法 ?

标签: windowsmultithreadingmutexcritical-section

解决方案


推荐阅读