Ввод-вывод с оповещением
Оповещенный ввод-вывод — это метод, с помощью которого потоки приложения обрабатывают асинхронные запросы ввода-вывода только в том случае, если они находятся в состоянии оповещения.
Чтобы понять, когда поток находится в состоянии оповещений, рассмотрим следующий сценарий:
- Поток инициирует асинхронный запрос на чтение, вызывая ReadFileEx с указателем на функцию обратного вызова.
- Поток инициирует асинхронный запрос на запись, вызывая WriteFileEx с указателем на функцию обратного вызова.
- Поток вызывает функцию, которая получает строку данных с удаленного сервера базы данных.
В этом сценарии вызовы ReadFileEx и WriteFileEx , скорее всего, будут возвращены до вызова функции на шаге 3. После этого ядро помещает указатели на функции обратного вызова в очереди асинхронных вызовов процедур (APC) потока. Ядро поддерживает эту очередь специально для хранения возвращенных данных запроса ввода-вывода до тех пор, пока они не будут обработаны соответствующим потоком.
Когда выборка строки завершена и поток возвращается из функции, его наивысший приоритет заключается в обработке возвращенных запросов ввода-вывода в очереди путем вызова функций обратного вызова. Для этого он должен перейти в состояние с оповещениями. Поток может сделать это только путем вызова одной из следующих функций с соответствующими флагами:
- SleepEx
- WaitForSingleObjectEx
- WaitForMultipleObjectsEx
- SignalObjectAndWait
- MsgWaitForMultipleObjectsEx
Когда поток переходит в состояние с оповещениями, происходят следующие события:
- Ядро проверяет очередь APC потока. Если очередь содержит указатели функций обратного вызова, ядро удаляет указатель из очереди и отправляет его в поток.
- Поток выполняет функцию обратного вызова.
- Шаги 1 и 2 повторяются для каждого указателя, остающегося в очереди.
- Если очередь пуста, поток возвращается из функции, которая переместила ее в состояние предупреждения.
В этом сценарии, как только поток перейдет в состояние с оповещениями, он вызывает функции обратного вызова, отправленные в ReadFileEx и WriteFileEx, а затем возвращается из функции, которая поставила его в состояние оповещения.
Если поток переходит в состояние с оповещениями, пока его очередь APC пуста, выполнение потока будет приостановлено ядром до тех пор, пока не произойдет одно из следующих действий:
- Объект ядра, который ожидается, становится сигналом.
- Указатель функции обратного вызова помещается в очередь APC.
Поток, использующий оповещенный ввод-вывод, обрабатывает асинхронные запросы ввода-вывода более эффективно, чем когда они просто ожидают установки флага события в структуре OVERLAPPED , а механизм ввода-вывода с оповещением менее сложен, чем порты завершения ввода-вывода . Однако оповещенный ввод-вывод возвращает результат запроса ввода-вывода только потоку, который его инициировал. Порты завершения ввода-вывода не имеют этого ограничения.
Связанные темы