所以我们有一个断言引擎。
它的作用是创建一个断言辅助线程,挂起所有其他线程,然后在辅助线程中弹出一些交互式 UI,与用户讨论断言失败。 (我们挂起其他线程,因为我们想要断言失败时程序状态的快照,并且我们不希望其他线程前进)。
大多数情况下,这种方法效果很好。
一小部分时间,其中一个挂起的线程持有锁(通常是调试堆关键部分),并且断言帮助程序线程会阻塞其下一次分配(这是很难避免的)。
我可以看到两种解决方法。首先,取消进程内断言处理(让它启动进程外断言对话框,并使用 IPC 来回通信)。通过这种方式,我们可以在不进行堆分配的情况下管理通信。也许吧。
这是一项繁重的工作,因为这意味着我们必须将进程内的堆栈遍历代码移出进程等。
我们现在尝试的方法是添加看门狗线程。它会注意到断言辅助线程是否未能取得进展(可能是发送计时器消息失败,可能是其指令计数器停止移动;不相关的实现细节)。
当它检测到这种情况时,它会尝试打破僵局。
我们当前的方法是基本上随机地获取线程,唤醒它们,然后再次挂起它们,直到我们检测到断言辅助线程的进度。这是......随意且缓慢的。
为了更快地选择正确的线程,我想确定给定的 Windows 线程当前是否拥有关键部分(也许还有其他同步原语)。然后我们可以先尝试这些线程。
那么,有没有办法确定 Windows 线程在挂起时当前是否持有 CriticalSection?
最佳答案
我认为没有记录的方法来判断线程是否位于关键部分,并且,如果有,我认为这不是解决您的问题的正确方法。
但是要回答这个问题,您可以查看 CRITICAL_SECTION
数据结构并查看拥有它的线程的句柄。这并没有直接回答“这个线程是否在任何关键部分内?”的问题。但它确实可以让你回答:“这个线程是否在这个关键部分内?”至少在 CRITICAL_SECTION
的某些关键实现细节发生变化之前是这样。
对于您的实际问题,我会问您的断言引擎提供了哪些好处,而在断言失败时附加调试器不能更好地处理这些好处。调试器是外部的,可以绕过任何死锁,并且已经知道如何遍历堆栈,因此您不必重新实现它。
关于c++ - 确定 Windows 线程是否位于关键部分或类似区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32380675/