c++ - 如何使用 IOCP 异步读取文件?
问题描述
我遇到了一个实施问题。我对如何实现 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 为真?
解决方案
所以我的问题的答案在这里:
https://stackoverflow.com/a/680416/2788176
用非常简单(而且有点过于简单)的术语,你告诉 IOCP 你想要完成的 IO 工作。它将异步执行它们并维护每个作业结果的队列。您告诉 IOCP 工作的电话会立即返回(在 IO 发生时它不会阻塞)。您将返回一个概念上类似于 .NET IAsyncResult 的对象......如果您选择阻止,它可以让您阻止,或者您可以提供回调,或者您可以定期轮询以查看作业是否完成。
IOCP 实现可以在 windows SDK 中找到。
推荐阅读
- time-complexity - 大 O 复杂度估计
- qt - QML 不同按钮的相同设置
- php - 为什么我的没有使用包含函数出现在 PHP 中?
- c++ - c++ c风格零初始化{0}
- react-native - 未定义不是使用反应原生领域的对象
- c# - 使用 FlaUI.UIA3 生成等效代码以访问 WPF 中的 DevExpress DataGrid 行和列
- functional-programming - Scheme中流的空间复杂度
- ffmpeg - 使用 ffmpeg 组合视频片段和流
- javascript - Web Audio API - 计算滤波器的累积增益
- r - 需要帮助创建一个函数来删除一波数据,如果它是前一波数据的重复,以进行回顾性测量