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

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

最佳答案

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

由于QUA回调具有异步特性,因此使其可发出警报需要花费大量精力。您必须确保在地毯突然从其下方拉出时,不要泄漏该线程使用的任何资源。回调很难完成,几乎没有上下文可用来正确猜测需要清除的内容。除非您仅在少数几个地方使线程易于警惕。

但是,只要线程必须进行阻塞调用并且只能在少数几个地方发出警报,则最好使用WaitForMultipleObjects()。添加一个表明线程停止的事件。现在通过同步取消,清理变得容易得多。

如果线程永不阻塞,则可以在线程的主循环内使用超时为零的等待调用。由于缓存刷新,这是相当昂贵的。如果您不太在乎响应时间,请使用 volatile 的bool。您不应该,它也不是确定性的。

09-09 20:13
查看更多