代码之家  ›  专栏  ›  技术社区  ›  Karim

应用验证程序报告“线程不能拥有关键部分。”

  •  1
  • Karim  · 技术社区  · 17 年前

    所以应用验证程序正在引发此异常。据我所知,这条信息的文字有点误导。问题似乎是关键部分是由在关键部分被销毁之前被销毁的线程创建的。

    这是一个相对简单的修复方法,但是有人知道除了创建线程之外的其他线程会破坏Critical部分会产生什么后果吗?有多危险?只是担心关键部分手柄会“泄漏”,还是有更隐匿的副作用?

    • 用C++编写的应用程序(当然是Windows上)
    • 使用InitializeCriticalSelection创建的临界截面
    • 最终使用DeleteCriticalSection删除关键部分
    3 回复  |  直到 17 年前
        1
  •  2
  •   JaredPar    17 年前

    我相信你对这个信息的解释是正确的。我能找到的唯一参考资料如下。正如作者所说,堆栈跟踪是一个很好的线索

        2
  •  2
  •   DXM    14 年前

    条款:

    应用程序验证程序检测到获取关键节锁的线程正在尝试退出,而该节仍处于锁定状态

    这并不是抱怨那条线 创建 临界段,现在正在终止。这与谁创建和销毁该部分无关。这是抱怨,而且非常合理地说,这条线

        3
  •  1
  •   Eran    17 年前

    与COM对象等野兽相反,生命周期的关键部分并不绑定到某个线程。关键部分分两个阶段构建:创建时,它们仅由几个结构组成。当两个或多个线程发生争用时,将创建一个内核互斥体来正确处理同步。结构和互斥体都可以由任何线程创建、访问和破坏,不管是不是创建关键部分的线程。

    为了回答您的问题,上面的内容意味着您在一个线程中创建CS并在另一个线程中销毁CS应该没有问题。然而,这可能意味着设计存在一些问题。如果你还没有这样做,考虑用一个类来初始化CS,它将在构造函数中初始化CS,并在它的析构函数中销毁它(MFC的cMealLeChank这样做)。然后,在比使用它的范围更高的范围(全局、静态类成员,等等)上创建包装器。应该使创建和清理更容易。

    最后,关于错误消息本身——是否有可能被删除的线程已经进入CS而没有机会离开它(由于异常或其他原因)?如果是这样的话,你会收到一条看起来很奇怪的信息,指出一个真正的问题。