如何使用 IOCP 异步读取文件?
Posted
技术标签:
【中文标题】如何使用 IOCP 异步读取文件?【英文标题】:How to make asynchronous read of a file with IOCP? 【发布时间】:2021-02-10 11:58:29 【问题描述】:我遇到了实施问题。我对如何实现 IOCP 感到困惑。我在互联网上阅读了很多关于它的内容,但仍然缺少一步。 到目前为止,我学到的内容如下: 为了使用 IOCP:
-
在初始化函数上:
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
-
在读取功能上,我可以这样做:
ReadFile(..., &Overlapped); // this will return error == ERROR_IO_PENDING which is what I want - asynch read
-
现在我很难理解接下来的步骤。我是否应该在 ReadFile 之后生成一个线程并在该线程内等待,直到 GetQueuedCompletionStatus 为真?
【问题讨论】:
我不确定,如果 IOCP 是你想要的。将文件映射到内存可能是更好的选择。 我希望对单个设备(文件)同时发出 I/O 请求。据我了解 IOCP 用于此 谢谢。我非常感谢您对这个问题的意见。但是我问的是如何使用它,而不是做什么。我想通过一个简单的例子来学习 IOCP 以了解如何实现它 【参考方案1】:所以我的问题的答案就在这里:
https://***.com/a/680416/2788176
用非常简单(而且有点过于简单)的术语,您告诉 IOCP 关于您想要完成的 IO 作业。它将执行它们 异步并维护每个结果的队列 工作。您告诉 IOCP 工作的电话会立即返回(它 IO 发生时不会阻塞)。您将返回一个对象 在概念上类似于 .NET IAsyncResult ...它允许您阻止 您选择,或者您可以提供回调,或者您可以定期 轮询以查看作业是否完成。
IOCP 实现可以在 windows SDK 中找到。
【讨论】:
以上是关于如何使用 IOCP 异步读取文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用异步 i/o 和 IOCP 实现回显服务器的最佳方法是啥?