c++ - 确定 Windows 线程是否位于关键部分或类似区域?

标签 c++ multithreading winapi critical-section

所以我们有一个断言引擎。

它的作用是创建一个断言辅助线程,挂起所有其他线程,然后在辅助线程中弹出一些交互式 UI,与用户讨论断言失败。 (我们挂起其他线程,因为我们想要断言失败时程序状态的快照,并且我们不希望其他线程前进)。

大多数情况下,这种方法效果很好。

一小部分时间,其中一个挂起的线程持有锁(通常是调试堆关键部分),并且断言帮助程序线程会阻塞其下一次分配(这是很难避免的)。

我可以看到两种解决方法。首先,取消进程内断言处理(让它启动进程外断言对话框,并使用 IPC 来回通信)。通过这种方式,我们可以在不进行堆分配的情况下管理通信。也许吧。

这是一项繁重的工作,因为这意味着我们必须将进程内的堆栈遍历代码移出进程等。

我们现在尝试的方法是添加看门狗线程。它会注意到断言辅助线程是否未能取得进展(可能是发送计时器消息失败,可能是其指令计数器停止移动;不相关的实现细节)。

当它检测到这种情况时,它会尝试打破僵局。

我们当前的方法是基本上随机地获取线程,唤醒它们,然后再次挂起它们,直到我们检测到断言辅助线程的进度。这是......随意且缓慢的。

为了更快地选择正确的线程,我想确定给定的 Windows 线程当前是否拥有关键部分(也许还有其他同步原语)。然后我们可以先尝试这些线程。

那么,有没有办法确定 Windows 线程在挂起时当前是否持有 CriticalSection?

最佳答案

我认为没有记录的方法来判断线程是否位于关键部分,并且,如果有,我认为这不是解决您的问题的正确方法。

但是要回答这个问题,您可以查看 CRITICAL_SECTION 数据结构并查看拥有它的线程的句柄。这并没有直接回答“这个线程是否在任何关键部分内?”的问题。但它确实可以让你回答:“这个线程是否在这个关键部分内?”至少在 CRITICAL_SECTION 的某些关键实现细节发生变化之前是这样。

对于您的实际问题,我会问您的断言引擎提供了哪些好处,而在断言失败时附加调试器不能更好地处理这些好处。调试器是外部的,可以绕过任何死锁,并且已经知道如何遍历堆栈,因此您不必重新实现它。

关于c++ - 确定 Windows 线程是否位于关键部分或类似区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32380675/

相关文章:

c++ - 从 32 位应用程序打开 64 位注册表编辑器

c++ - 两个不同的库使用相同的名称类型

c++ - 在具有模板和继承的 C++ 中使用未声明的标识符

c++ - 确定在 C++ 代码中调用了哪些复制构造函数

Python 多线程/处理模块,用于具有需要排序的依赖项的任务

c++ - 在 C++ Win32 应用程序中,我如何确定私有(private)字节、工作集和虚拟大小

c++ - 服务定位器实现

c++ - 检查线程是否完成的正确方法?

c - 如何确保 pthread_cond_wait() 不会错过任何 pthread_cond_signal()?

windows - 与 x86_64 Windows 调用约定混淆