Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Вместо того чтобы заставлять поток ожидать сигнала завершения от события или дескриптора, система может вызвать указанную пользователем процедуру завершения, когда операция ввода-вывода закончится. Эта процедура завершения может запустить следующую операцию ввода-вывода и выполнить любое другое действие.
Как программа может задать процедуру завершения? Существует семейство расширенных функций ввода-вывода, отличающихся суффиксом Ех, которые имеют дополнительный параметр для адреса процедуры завершения. Расширенные функции чтения и записи — ReadFileEx и WriteFileEx. Кроме того, следует использовать одну из пяти ожидающих функций предупреждения.
• WaitForSingleObjectEx
• WaitForMultipleObjectsEx
• SleepEx
• SignalObjectAndWait
• MsgWaitForMultipleObjectsEx
Расширенный ввод-вывод иногда называется вводом-выводом с предупреждением.
Порты завершения ввода-вывода
Порты завершения ввода-вывода объединяют возможности ввода-вывода с перекрытием и возможности независимых потоков и наиболее полезны в серверных программах.
Порты завершения ввода-вывода позволяют создавать ограниченное количество потоков сервера в группе потоков при наличии очень большого числа дескрипторов именованных каналов (или сокетов). Дескрипторы не связаны с отдельными потоками-рабочими сервера, но поток сервера может обрабатывать данные от любого дескриптора, на котором они доступны.
Следовательно, порт завершения ввода-вывода представляет собой набор дескрипторов с перекрытием, а потоки ожидают сигнала порта. Когда чтение или запись на одном из дескрипторов заканчиваются, один поток переходит в активное состояние и получает данные и результаты операции ввода-вывода. После этого он может обработать данные и снова ожидать сигнала порта.
Первая задача состоит в том, чтобы создать порт завершения ввода-вывода и внести в него дескрипторы с перекрытием.
Управление портами завершения ввода-вывода
Функция CreateIoCompletionPort служит как для создания порта, так и для добавления дескрипторов. Поскольку она должна выполнять две задачи, порядок использования ее параметров довольно сложен.
HANDLE CreateIoCompletionPort (HANDLE FileHandle,
HANDLE ExistingCompletionPort, DWORD CompletionKey,
DWORD NumberOfConcurrentThreads);
Параметры
Порт завершения ввода-вывода — это совокупность дескрипторов файлов, открытых в режиме OVERLAPPED. Параметр FileHandle — это асинхронный дескриптор, который добавляется в порт. Если в этом параметре указать значение INVALID_HANDLE_VALUE, функция создает новый порт завершения ввода-вывода и возвращает его как возвращаемое значение. Следующий параметр, ExistingCompletionPort, в этом случае должен иметь значение NULL.
ExistingCompletionPort — порт, созданный при первом вызове, и порт, в который добавляется дескриптор из первого параметра. Если добавление прошло успешно, функция также возвращает дескриптор порта, при неудаче возвращается NULL.
CompletionKey задает ключ, который будет входить в пакет завершения для FileHandle. Этот ключ обычно является индексом массива структур данных, содержащих тип операции, дескриптор и указатель на буфер данных.
NumberOfConcurrentThreads указывает максимальное число потоков, которые могут работать одновременно. Все потоки вне этого предела, ожидающие сигнала порта, остаются заблокированными. Если этот параметр равен нулю, пределом будет число процессоров в системе.
С портом завершения ввода-вывода можно связать. неограниченное количество асинхронных дескрипторов. При первом вызове CreateIoCompletionPort создается порт и определяется максимальное число потоков. Для каждого дескриптора, который должен быть связан с портом, эту функцию надо вызывать снова. К сожалению, не существует способа удаления дескриптора из порта завершения.
Дескрипторы, связанные с портом, не должны использоваться в функциях ReadFileEx или WriteFileEx. В документации Microsoft не рекомендуется совместно использовать файлы или другие объекты с помощью других открытых дескрипторов. [kgl].
Основная литература: [1] – 46 - 52 c., 359 – 386 с.
Контрольные вопросы:
1. Каким устройствам обычно назначаются стандартные устройства?
2. Специальные функции консольного ввода-вывода
метода выполнения асинхронного ввода-вывода
[gl] Лекция 13. Тема: Безопасность объектов Win32[:]
Дата публикования: 2015-11-01; Прочитано: 581 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!