Я столкнулся с проблемой реализации. Я озадачен тем, как реализовать 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 не станет истинным?
0
user 10 Фев 2021 в 14:58

1 ответ

Лучший ответ

Итак, ответ на мой вопрос здесь:

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

Выражаясь очень упрощенно (и немного упрощенно), вы сообщаете IOCP о задачах ввода-вывода, которые вы хотите выполнить. Он будет выполнять их асинхронно и поддерживать очередь результатов каждого из этих заданий. Ваш вызов, чтобы сообщить IOCP о задании, немедленно возвращается (он не блокируется, пока выполняется ввод-вывод). Вам возвращается объект, который концептуально похож на .NET IAsyncResult ... он позволяет вам блокировать, если вы захотите, или вы можете предоставить обратный вызов, или вы можете периодически опрашивать, чтобы узнать, завершено ли задание.

Реализацию IOCP можно найти в Windows SDK.

0
user 18 Фев 2021 в 14:13