代码之家  ›  专栏  ›  技术社区  ›  Jay

Windows API类似于pthread_cancel?

  •  4
  • Jay  · 技术社区  · 15 年前

    是否有类似于pthread_cancel、pthread_testcancel等的Windows本机API?

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

    2 回复  |  直到 15 年前
        1
  •  6
  •   Hans Passant    15 年前

    不需要线程本身的任何合作就取消线程是不可能的。TerminateThread()API函数仅适用于进程关闭期间。是的,您也可以使queueuserapc()工作,但这仍然需要线程的合作。它必须阻塞一个等待句柄,并明确地表示它是可警报的(例如,waitforsingleobjectex的balertable参数)。

    由于qua回调的异步性质,使其可发出警报需要在代码中进行大量的工作。当地毯突然从下面被拉出时,你必须确保你不会泄漏线程使用的任何资源。很难做到,回调没有足够的上下文来正确猜测需要清理的内容。除非只在少数地方使线程具有警报性。

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

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

        2
  •  2
  •   JesperE    15 年前

    这个 Pthreads/win32 FAQ 在第9个问题中谈到这个问题,“取消对我不起作用,为什么?”.faq提到pthreads库使用名为“queueuserapcex”的包来实现真正的异步用户模式通知。您的问题不清楚您是否使用pthreads/win32,但是您可以在 Pthreads/win32 source code .