C Windows API类似于pthread\u取消?

C Windows API类似于pthread\u取消?,c,windows,multithreading,C,Windows,Multithreading,是否有类似于pthread\u cancel、pthread\u testcancel等的Windows本机API 如果没有,我们如何在Windows中使用pthread_cancel机制模拟从一个线程取消另一个线程?问题9“取消对我不起作用,为什么?”。常见问题解答提到Pthreads库使用一个名为“QueueUserAPCEx”的包来实现真正的异步用户模式通知。您的问题不清楚您是否正在使用Pthreads/win32,但您可能会在中找到一些提示和实现细节。不可能在线程本身没有任何合作的情况下

是否有类似于pthread\u cancel、pthread\u testcancel等的Windows本机API


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

问题9“取消对我不起作用,为什么?”。常见问题解答提到Pthreads库使用一个名为“QueueUserAPCEx”的包来实现真正的异步用户模式通知。您的问题不清楚您是否正在使用Pthreads/win32,但您可能会在中找到一些提示和实现细节。

不可能在线程本身没有任何合作的情况下取消线程。TerminateThread()API函数仅适用于进程关闭期间。是的,您也可以让QueueUserAPC()工作,但这仍然需要线程的合作。它必须阻塞一个等待句柄,并明确表示它是可警报的(比如WaitForSingleObjectEx的bAlertable参数)

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

但是,只要线程必须进行阻塞调用,并且只能在少数地方发出警报,就可以使用WaitForMultipleObjects()。添加向线程发送停止信号的事件。取消现在将同步,清理更容易


如果线程的主循环从不阻塞,则可以在线程的主循环中使用具有零超时的等待调用。由于缓存刷新,这相当昂贵。如果你不太在意响应时间,那么就使用一个不稳定的bool。您不应该这样做,反正它不是很确定。

我没有使用pthreads/win32。我使用的是windows本机API。看来pthreads/win32基本上不支持pthread_cancel'ing I/O,除非您在系统中也安装了QueueUserAPCEx.dll。您可以使用CancelSynchronousIo FWIW取消vista+中的同步I/O。另请参见:I/o对于pthreads,pthread_push可简化清理部分。。和pthread_pop。。一套API。Windows中没有这样的机制吗?我所说的清理就是释放资源。释放内存、关闭文件、关闭句柄。这在C/C++中不是自动的。