首页 > 解决方案 > 如何使用 IOCP 异步读取文件?

问题描述

我遇到了一个实施问题。我对如何实现 IOCP 感到困惑。我在互联网上阅读了很多关于它的内容,但仍然缺少一步。到目前为止,我学到的内容如下: 为了使用 IOCP:

  1. 在初始化函数上:
CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); // to have a max thread number available
handler = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED , 0);
CreateIoCompletionPort(handler, NULL, 0, 0); // to associate my handler with an IOCP
  1. 在读取功能上,我可以这样做:
ReadFile(..., &Overlapped); // this will return error == ERROR_IO_PENDING which is what I want - asynch read
  1. 现在我很难理解接下来的步骤。我是否应该在 ReadFile 之后生成一个线程并在该线程内等待直到 GetQueuedCompletionStatus 为真?

标签: c++iocp

解决方案


所以我的问题的答案在这里:

https://stackoverflow.com/a/680416/2788176

用非常简单(而且有点过于简单)的术语,你告诉 IOCP 你想要完成的 IO 工作。它将异步执行它们并维护每个作业结果的队列。您告诉 IOCP 工作的电话会立即返回(在 IO 发生时它不会阻塞)。您将返回一个概念上类似于 .NET IAsyncResult 的对象......如果您选择阻止,它可以让您阻止,或者您可以提供回调,或者您可以定期轮询以查看作业是否完成。

IOCP 实现可以在 windows SDK 中找到。


推荐阅读