Windows API类似于pthread_cancel?

时间:2010-01-01 10:05:51

标签: c windows multithreading

是否存在类似于pthread_cancel,pthread_testcancel等的Windows原生API?

如果没有,我们如何使用Windows中的pthread_cancel机制模拟从另一个线程中取消一个线程?

2 个答案:

答案 0 :(得分:6)

无法在没有任何线程合作的情况下取消线程。 TerminateThread()API函数仅适用于进程关闭期间。是的,您可以使QueueUserAPC()工作,但仍然需要线程的合作。它必须阻塞等待句柄并明确表示它是可警告的(例如,WaitForSingleObjectEx的bAlertable参数)。

由于QUA回调的异步特性,使其具有警报性需要在代码中花费大量精力。当地毯突然从地下拉出时,你必须确保不会泄漏线程使用的任何资源。很难做到,回调几乎没有上下文可以正确猜出需要清理的内容。除非你只在几个地方使线程可以警报。

但是,只要线程必须进行阻塞调用并且只能在几个地方进行警报,您也可以使用WaitForMultipleObjects()。添加一个表示线程停止的事件。取消现在将通过同步,清理更容易。

如果线程的主循环中永远不会阻塞,则可以在等待调用中使用零超时。由于缓存刷新,这相当昂贵。如果您不太关心响应时间,请使用挥发性bool。你不应该,反正它不是很确定。

答案 1 :(得分:2)

Pthreads/win32 FAQ在问题9下谈到这一点,“取消对我不起作用,为什么?”。 FAQ使用名为“QueueUserAPCEx”的包来提及Pthreads库,以实现真正的异步用户模式通知。您的问题是否使用Pthreads / win32并不清楚,但您可以在Pthreads/win32 source code中找到一些提示和实现细节。