【问题标题】:Windows API similar to pthread_cancel?类似于 pthread_cancel 的 Windows API?
【发布时间】:2010-01-01 10:05:51
【问题描述】:

是否有类似于 pthread_cancel、pthread_testcancel 等的 Windows 原生 API?

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

【问题讨论】:

    标签: c windows multithreading


    【解决方案1】:

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

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

    但是,只要线程必须进行阻塞调用并且只能在少数地方发出警报,那么您不妨使用 WaitForMultipleObjects()。添加一个指示线程停止的事件。现在将通过同步取消,清理更容易。

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

    【讨论】:

    • 在 pthreads 的情况下,pthread_push.. 和 pthread_pop.. API 集使清理部分变得容易。 Windows 中没有这样的机制吗?
    • 我说的清理是释放资源。释放内存、关闭文件、关闭句柄。这在 C/C++ 中不是自动的。
    【解决方案2】:

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

    【讨论】:

    • 我没有使用 pthreads/win32。我正在使用 Windows 原生 API。
    • 看来 pthreads/win32 基本上原生支持 pthread_cancel'ing I/O,除非您还在系统中安装了 QueueUserAPCEx .dll。您可以使用 CancelSynchronousIo FWIW 在 vi​​sta+ 中取消同步 I/O。另请参阅stackoverflow.com/questions/5168372/… re: I/O
    猜你喜欢
    • 2014-04-07
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多