【问题标题】:Does an IO completetion port spawn a new thread before or after the completion port has something to report?IO 完成端口是否在完成端口有要报告的内容之前或之后产生一个新线程?
【发布时间】:2012-10-22 02:37:53
【问题描述】:

对于 IO 完成端口完成时实际发生的情况,我有点困惑。

我认为 Win API 允许访问 IOCP 队列,该队列能够以某种方式将具有特定句柄(假设是套接字)的回调引用排队(或堆叠)。 当 Windows 收到来自 NIC 的中断时,它会在某个时刻进入 NIC 的 IOCP 队列并在其 自己的 (IOCP) 线程池上执行回调。

我的问题是,线程池中的这个线程是在收到中断时产生的,还是实际上是在调用 Win API 时产生的,有效地使线程处于等待状态,直到它被唤醒通过 IOCP 队列?

编辑:
我发现了这个:http://msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-i-o-and-the-thread-pool.aspx where is states: “每当该操作完成时,它将在该 I/O 完成端口上排队一个数据包。然后该端口将继续并使用线程池的线程之一来运行回调你已经指定了。”

【问题讨论】:

  • 只是为了澄清,这是一个关于重叠 IO 如何管理事件通知的接收将其带到 IOCP 用户管理的线程池的问题,对吗?跨度>
  • 没有。 IOCP创建的线程是在端口有一些IO之前创建的(在这种情况下它们被阻塞),还是在端口有一些IO要报告的时候创建线程是一个问题。
  • 不太清楚你在说什么。中断由驱动程序处理。您的代码是使用 GetQueuedCompletionStatus() 还是后来的 CreateThreadPoolIo() 很重要。在第一种情况下,您创建 tp 线程。在最后一种情况下,Windows 在重叠 I/O 完成时创建它。
  • I/O 完成端口不创建线程。 在调用 GetQueueCompletionStatus 时创建线程并将它们订阅到 IOCP。
  • @lejon:如果您调用GetQueuedCompletionStatus() 并将其dwMillisecond 参数设置为非零值,那么是的,调用线程将被阻塞,直到IOCP 完成或超时结束,以两者为准首先发生。

标签: windows winapi iocp


【解决方案1】:

将 I/O 完成端口简单地视为线程安全队列可能更容易,操作系统在重叠操作完成后将它们放入其中。

您创建 IOCP,然后创建一些线程,这些线程调用一个函数来从该队列中删除项目。通常这是GetQueuedCompletionStatus()。这个函数本质上会阻塞你的线程,直到 IOCP(队列)中有东西,然后允许你的线程检索那个东西并运行。

您将文件句柄和套接字与 IOCP 关联,这仅意味着一旦关联它们的重叠完成将被放置在您的 IOCP(队列)中。

它比这更复杂,但这是你应该思考的方式。

【讨论】:

  • 只是为了澄清。在我的应用程序中,我创建了我的 own 线程池,并将一个线程池线程传递给 IOCP,然后被 IOCP 阻塞直到某事完成?很难理解,因为对于这实际上是如何工作的似乎有不同的“意见”,例如查看我的编辑。
  • 池中的线程将阻塞等待工作的 IOCP,其他一切都与我的回答中所述相同。池如何决定更改它持有的线程数与 IOCP 没有任何关系。它可能能够监视其线程何时调用 GetQueuedCompletionStatus(),如果当前没有线程并且某些超时到期,则它可能会创建更多线程,然后它们将阻塞 IOCP 等待工作。我不知道线程池的实现,所以不能多说。
  • 假设我在 UI 线程上调用 IOCP,它会阻塞直到我得到我的 IOCP 数据包?你有 IOCP 内部的参考吗?
  • “调用 IOCP”我假设您的意思是调用 GetQueuedCompletionStatus() 或等效方法?如果是这样,那么是的,它将阻塞,直到完成数据包可用。不,我没有对 IOCP 内部本身的任何引用。我刚刚阅读了 MSDN 文档和 Richter 的书籍和其他资料。
  • 我明白了。似乎很奇怪,这个事实在任何地方都没有清楚地描述(我已经能够找到)。就在今天早上,我正在观看 Mads Torgersen 的演讲幻灯片,幻灯片中出现了以下文字:“几秒钟后,Web 服务已将答案传递给 IO Completion Port 线程!”
猜你喜欢
  • 2010-10-07
  • 2014-02-08
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多