Ввод-вывод с оповещением

Оповещенный ввод-вывод — это метод, с помощью которого потоки приложения обрабатывают асинхронные запросы ввода-вывода только в том случае, если они находятся в состоянии оповещения.

Чтобы понять, когда поток находится в состоянии оповещений, рассмотрим следующий сценарий:

  1. Поток инициирует асинхронный запрос на чтение, вызывая ReadFileEx с указателем на функцию обратного вызова.
  2. Поток инициирует асинхронный запрос на запись, вызывая WriteFileEx с указателем на функцию обратного вызова.
  3. Поток вызывает функцию, которая получает строку данных с удаленного сервера базы данных.

В этом сценарии вызовы ReadFileEx и WriteFileEx , скорее всего, будут возвращены до вызова функции на шаге 3. После этого ядро помещает указатели на функции обратного вызова в очереди асинхронных вызовов процедур (APC) потока. Ядро поддерживает эту очередь специально для хранения возвращенных данных запроса ввода-вывода до тех пор, пока они не будут обработаны соответствующим потоком.

Когда выборка строки завершена и поток возвращается из функции, его наивысший приоритет заключается в обработке возвращенных запросов ввода-вывода в очереди путем вызова функций обратного вызова. Для этого он должен перейти в состояние с оповещениями. Поток может сделать это только путем вызова одной из следующих функций с соответствующими флагами:

Когда поток переходит в состояние с оповещениями, происходят следующие события:

  1. Ядро проверяет очередь APC потока. Если очередь содержит указатели функций обратного вызова, ядро удаляет указатель из очереди и отправляет его в поток.
  2. Поток выполняет функцию обратного вызова.
  3. Шаги 1 и 2 повторяются для каждого указателя, остающегося в очереди.
  4. Если очередь пуста, поток возвращается из функции, которая переместила ее в состояние предупреждения.

В этом сценарии, как только поток перейдет в состояние с оповещениями, он вызывает функции обратного вызова, отправленные в ReadFileEx и WriteFileEx, а затем возвращается из функции, которая поставила его в состояние оповещения.

Если поток переходит в состояние с оповещениями, пока его очередь APC пуста, выполнение потока будет приостановлено ядром до тех пор, пока не произойдет одно из следующих действий:

  • Объект ядра, который ожидается, становится сигналом.
  • Указатель функции обратного вызова помещается в очередь APC.

Поток, использующий оповещенный ввод-вывод, обрабатывает асинхронные запросы ввода-вывода более эффективно, чем когда они просто ожидают установки флага события в структуре OVERLAPPED , а механизм ввода-вывода с оповещением менее сложен, чем порты завершения ввода-вывода . Однако оповещенный ввод-вывод возвращает результат запроса ввода-вывода только потоку, который его инициировал. Порты завершения ввода-вывода не имеют этого ограничения.

Асинхронные вызовы процедур