【问题标题】:What is a "wait thread"?什么是“等待线程”?
【发布时间】:2017-07-30 21:02:37
【问题描述】:

RegisterWaitForSingleObject() 函数的文档提到了一个“等待线程”,但我找不到任何解释/参考说明它到底是什么。

我认为它不是一个常规线程,否则RegisterWaitForSingleObject() 会阻塞一个线程,只等待并且什么都不做。

【问题讨论】:

  • 这是来自线程池的普通线程。但它可以等待多个对象、apc、计时器信号、io 完成等。所有这些线程只等待工作(对象发出信号、apc 等)并调用用户回调
  • 那些和CLR中的完成I/O端口线程一样吗?
  • 所有这些都是来自池的工作线程。实现取决于 Windows 版本。在 i/o 端口的 win2000/xp 中存在单独的线程,它们仅通过 ZwRemoveIoCompletion 在 IOCP 上等待。 apc/timer 线程通过ZwDelayExecution 等待。等待通过ZwWaitForMultipleObjects 等待的线程。从 vista 线程池开始严重重新设计。存在新的 apiZwWaitForWorkViaWorkingFactory,它不会中断计时器、i/o、等待的线程。存在新的池 api (CreateThreadpool 等) 但所有这些都只是线程
  • ZwWaitForWorkViaWorkerFactory 正确的 api 名称
  • 有人在另一个问答中提到,等待线程虽然是常规线程,但可以在多个句柄 (63) 上等待,因此至少每个信号不是一个线程。感谢您的 cmets。

标签: multithreading winapi threadpool


【解决方案1】:

您将一个等待对象句柄传递给RegisterWaitForSingleObject(),以及一个超时和一个回调。它从内部线程池中获取一个线程,该线程等待对象发出信号或超时,然后调用回调。因此,“等待线程”只是一个等待某事发生的线程。

【讨论】:

  • 确实,看起来你是对的,尽管有人提到它可以等待多个信号(最多 63 个),这至少提高了一点效率。
猜你喜欢
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2017-07-19
  • 2016-03-04
  • 2013-03-24
  • 2012-11-05
相关资源
最近更新 更多