Синхронный и асинхронный ввод и вывод данных

Вы можете выполнять или синхронные, или асинхронные (или перекрывающие) операции ввода-вывода (I/O) в файлах, в именованных каналах и на последовательных коммуникационных устройствах. Функции WriteFile, ReadFile, DeviceIoControl, WaitCommEvent, ConnectNamedPipe и  TransactNamedPipe могут выполняться или синхронно, или асинхронно. Функции ReadFileEx и WriteFileEx могут выполняться только асинхронно.

Когда функция исполняется синхронно, она не возвращает значения до тех пор, пока операция не завершится. Это означает, что исполнение кода вызывающего потока может быть  заблокировано на неопределенный период, в то время, когда он  ожидает отнимающую много времени операцию завершения работы. Функции, вызываемые для асинхронной операции, могут возвратить значение немедленно, даже при том, что операция не завершилась. Это дает возможность  исполнить отнимающую много времени операцию ввода-вывода (I/O)  в фоновом режиме в то время, когда вызывающий поток особождается, чтобы выполнить другие задачи. Например, отдельный поток может выполнить одновременные операции ввода-вывода (I/O) с различными дескрипторами, или, даже, одновременные операции чтения и записи с одним и тем же дескриптором.

Чтобы синхронизировать исполнение  своего кода с завершением асинхронной операции, вызывающий поток использует функцию GetOverlappedResult или одну из функций ожидания для выяснения, когда завершиться асинхронная операция. Вы можете также использовать и макрос HasOverlappedIoCompleted для  опроса о завершении.

Чтобы отменить все ожидающие обработки асинхронные операции ввода-вывода (I/O), используйте функцию CancelIo. Эта функция только отменяет операции, порождаемые вызывающим потоком для заданного дескриптора файла.

Асинхронные операции требуют файла, именованного канала или коммуникационного устройства, которое создавалось с флажком FILE_FLAG_OVERLAPPED. Чтобы вызывать функцию, которая осуществить асинхронную операцию, вызывающий поток должен установить указатель на структуру OVERLAPPED. Если этот указатель - ПУСТО (NULL),  функция возвратит значение, которое может неправильно указать, что операция завершилась. Структура OVERLAPPED должна содержать дескриптор объект события сброса вручную (не автоматического сброса). Система устанавливает состояние объекта события в несигнальноое, когда вызов функции ввода - вывода  возвращает значение перед тем как операция завершится. Система устанавливает состояние объекта события в сигнальное, когда операция завершилась.

Когда функция вызывается, чтобы выполнить асинхронную операцию, возможно, что операция должна быть завершена перед тем как функция возвратит значение. Когда это случается, результаты обрабатываются так, как будто операция выполнилась синхронно. Однако, если операция не была закончена, возвращаемое значение функции - ЛОЖЬ (FALSE), а функцией GetLastError возвращает значение  ERROR_IO_PENDING.

Поток может управлять асинхронными операциями любым из двух методов:

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

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

Примеры, которые иллюстрируют использование асинхронных операций, стандартных процедур завершения и функции GetOverlappedResult, смотрите в статье Использование каналов.

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz