gpt4 book ai didi

c++ - 确定 Windows 线程是否在临界区或类似区域?

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:42 25 4
gpt4 key购买 nike

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

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

这在大多数情况下都很有效。

一小部分时间,其中一个挂起的线程持有锁——通常是调试堆临界区——断言助手线程会在其下一次分配时阻塞(这很难避免)。

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

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

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

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

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

为了更快地选择正确的线程,我想确定给定的 Windows 线程当前是否拥有临界区(可能还有其他同步原语)。然后我们可以先尝试那些线程。

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

最佳答案

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com