【发布时间】:2010-01-01 10:05:51
【问题描述】:
是否有类似于 pthread_cancel、pthread_testcancel 等的 Windows 原生 API?
如果不是,我们如何使用 Windows 中的 pthread_cancel 机制模拟从另一个线程中取消一个线程?
【问题讨论】:
标签: c windows multithreading
是否有类似于 pthread_cancel、pthread_testcancel 等的 Windows 原生 API?
如果不是,我们如何使用 Windows 中的 pthread_cancel 机制模拟从另一个线程中取消一个线程?
【问题讨论】:
标签: c windows multithreading
在没有线程本身的任何合作的情况下取消线程是不可能的。 TerminateThread() API 函数仅适用于进程关闭期间。是的,您也可以使 QueueUserAPC() 工作,但这仍然需要线程的合作。它必须阻塞等待句柄并明确表示它是可警报的(例如 WaitForSingleObjectEx 的 bAlertable 参数)。
由于 QUA 回调的异步特性,使其可警报需要在您的代码中付出很多努力。当地毯突然从它下面拉出时,你必须确保你不会泄漏线程使用的任何资源。很难做到,回调几乎没有可用的上下文来正确猜测需要清理的内容。除非你让线程只在少数几个地方发出警报。
但是,只要线程必须进行阻塞调用并且只能在少数地方发出警报,那么您不妨使用 WaitForMultipleObjects()。添加一个指示线程停止的事件。现在将通过同步取消,清理更容易。
如果线程从不阻塞,您可以在线程的主循环内使用具有零超时的等待调用。由于缓存刷新,这相当昂贵。如果您不太关心响应时间,请使用 volatile bool。你不应该,反正它不是很确定。
【讨论】:
Pthreads/win32 FAQ 在问题 9 中谈到了这一点,“取消对我不起作用,为什么?”。 FAQ 提到了使用名为“QueueUserAPCEx”的包的 Pthreads 库,以实现真正的异步用户模式通知。从您的问题中不清楚您是否使用 Pthreads/win32,但您可能会在 Pthreads/win32 source code 中找到一些提示和实现细节。
【讨论】: