因此App Verifier抛出此异常。从我收集的内容来看,这条消息的内容有点误导。问题似乎是临界区是由一个在关键部分被销毁之前被销毁的线程创建的。
这是一个相对简单的修复,但是有没有人知道除了创建一个线程之外的其他线程会破坏crticial部分的后果是什么?这有多危险?关注的只是关键部分句柄会“泄漏”或是否存在更加阴险的副作用?
其他一些信息:
答案 0 :(得分:2)
我相信你对这条消息的解释是正确的。我能找到的唯一参考如下。堆栈跟踪是一个很好的线索,作者建议
我挖了一下,找不到任何具体的原因,为什么你不能在不同的线程上创建和删除一个关键部分。但是我想知道你为什么要这样做?最好的做法是让一个线程拥有一个关键部分可以这么说。在线程之间移除关键部分引入了另一种通信方式和潜在错误(可以完成,只是更有趣)。
答案 1 :(得分:2)
似乎接受了关于创建关键部分的回答,这不是这条消息的内容。 Eran的答案涵盖了消息的真正原因,但这里是 TL; DR 术语:
应用程序验证程序检测到一个获取临界区锁定的线程正在尝试退出该区段仍处于锁定状态
没有抱怨线程创建了关键部分,现在正在终止。这与谁创建和销毁该部分无关。它正在抱怨,并且非常合理地说,线程拥有该关键部分的锁并终止。他们可以使这条信息的措辞更加清晰。
答案 2 :(得分:1)
与COM对象等野兽相反,关键部分的生命周期不限于某个线程。关键部分分两个阶段构建:在创建时,它们仅由几个结构组成。在争用两个或多个线程时,会创建内核互斥锁以正确处理同步。结构和互斥体都可以被任何线程创建,访问和销毁,无论是否创建了关键部分。
要回答您的问题,上述意味着您在一个线程中创建CS并在另一个线程中销毁CS应该没有问题。然而,这可能意味着设计存在一些问题。如果您还没有这样做,请考虑使用将在其构造函数中初始化CS的类包装CS,并在其析构函数中销毁它(MFC的CCriticalSection就是这样)。然后,创建包装器的范围比使用它的范围更高(全局,静态类成员,等等)。应该使创建和清理更容易。
最后,关于错误消息本身 - 被删除的线程是否有可能在没有机会离开的情况下进入CS(由于异常等)?如果是这种情况,你会看到一个奇怪的消息,指出一个真正的问题。