Ожидание в готовности к вводу/выводу данных - это метод, при помощи которого потоки обрабатывают запросы на асинхронный ввод-вывод данных лишь тогда, когда они находятся в состоянии ожидания в готовности.
Чтобы понять, когда поток находится в состоянии ожидания в готовности, рассмотрим нижеследующий сценарий:
В этом сценарии вызовы функций ReadFile и WriteFile наиболее вероятно возвратят значение перед тем, как произойдет вызов функции в шаге 3. Когда они это делают, ядро ОС помещает указатели на функции обратного вызова в очереди потока Асинхронного вызова процедур (APC). Ядро специально обслуживает эту очередь, чтобы удерживать возвращаемые данные запроса ввода-вывода (I/O) до тех пор, пока они не будут обработаны соответствующим потоком.
Когда выборка необработанных данных завершается и поток возвращает значение из функции, то, согласно его высшему приоритету, поток должен обработать возвращаемые запросы ввода-вывода в очереди при помощи вызова функций обратного вызова. Чтобы сделать это, поток должен ввести состояние ожидания в готовности. Поток может сделать это только при помощи вызова одной из нижеследующих функций с соответствующими флажками:
Когда поток вводит состояние ожидания в готовности, происходят нижеследующие события:
В этом сценарии, поток один раз вводит состояние ожидания в готовности, он отправляет вызовы функций обратного вызова из ReadFile и WriteFile, а затем возвращает значение из функции, которая поместила его в состояние ожидания в готовности.
Если поток вводит состояние ожидания в готовности в то время как его очередь APC пуста, то исполнение кода потока должно быть приостановлено ядром до тех пор, пока не произойдет одно из нижеследующего:
Поток, который использует ожидание в готовности к вводу/выводу (I/O) данных, обрабатывает запросы на асинхронный ввод/вывод более эффективно, чем тогда, когда он просто ждет установки флажка события в структуре OVERLAPPED, и механизм ожидания в готовности к вводу/выводу данных менее сложный для использования, чем Порты завершения ввода-вывода (I/O). Однако, ожидание в готовности к вводу/выводу данных возвращает результат запроса ввода-вывода только к потоку, который инициировал его. У портов завершения ввода-вывода этого ограничения нет.