如何为 MFC 线程设置超时

Posted

技术标签:

【中文标题】如何为 MFC 线程设置超时【英文标题】:How to set a timeout to a MFC Thread 【发布时间】:2016-07-14 12:53:51 【问题描述】:

我需要创建一个线程来尝试在特定时间内执行一个函数。如果线程没有成功,我需要用一个表示错误的数字来结束他。

我正在尝试执行此操作,因为我必须执行程序的外部库,但有时会进入无限循环以搜索尚未准备好的资源并且程序中断等待该功能。

【问题讨论】:

你开始开发过程了吗?请分享您的代码 记住,如果你终止一个线程,它持有的任何锁和外部资源都不会被释放。 而且,虽然是正确的,但@RichardCritten 的评论听起来甚至没有应有的一半危险。锁发挥核心作用的常见场景是序列化堆访问。如果您TerminateThread 一个线程,当它处于分配内存的中间时,任何后续从同一个堆分配内存的尝试都将等待一个锁,该锁永远不会被释放。所以你用死锁交换了无限循环。这是朝着某个方向迈出的一步,而不是向前迈出的一步。 【参考方案1】:

您无法通过将错误实现卸载到同一进程中的另一个线程来解决此问题,因为没有办法安全地关闭该线程,以防它运行时发生冲突。调用TerminateThread 是从外部取消线程的唯一方法。由于后果,它不能在进程必须继续可靠运行时使用。

例如,TerminateThread 会导致以下问题:

如果目标线程拥有临界区,则不会释放临界区。 如果目标线程正在从堆中分配内存,则不会释放堆锁。 如果目标线程在终止时正在执行某些 kernel32 调用,则线程进程的 kernel32 状态可能不一致。 如果目标线程正在操作共享 DLL 的全局状态,则 DLL 的状态可能会被破坏,从而影响 DLL 的其他用户。

您唯一的选择是:

    向第 3 方库的供应商请求修复错误。 将第 3 方库卸载到自己的进程中。在这个代理进程中,您可以在其自己的线程上运行 3rd 方库,如果它没有及时返回(使用带有超时值的 WaitForSingleObject 来确定该条件),请调用 ExitProcess 以结束痛苦。您必须在您的进程之间实现 interprocess communications 才能使其正常工作。

【讨论】:

以上是关于如何为 MFC 线程设置超时的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个线程设置时区? [关闭]

如何为音频处理设置高优先级线程

如何为在线程上运行的单个任务设置最大执行时间?

wildfly:如何为 io 子系统中的工作人员设置最小或核心线程

如何为 xz 归档器设置默认参数?

MFC线程操作 WaitForMultipleObjects返回值