Эта функция блокирует поток до тех пор, пока порт не
передаст потоку пакет запроса или не истечет таймаут.
Поместить пакет запроса в порт можно с помощью функции
PostQueuedCompletionStatus.
BOOL PostQueuedCompletionStatus(
HANDLE CompletionPort,
// хендл порта завершения ввода/вывода
DWORD dwNumberOfBytesTransferred, // количество переданных байт
ULONG_PTR dwCompletionKey,
// ключ завершения
LPOVERLAPPED lpOverlapped
// структура OVERLAPPED
);
|
Пакет запроса не обязательно должен быть структурой
OVERLAPPED или производной от нее [2].
Давайте соберем всю информацию воедино. Порт
завершения – объект, организующий несколько очередей из клиентских запросов и
потоков, их обрабатывающих. Поток добавляется в очередь ожидающих запрос
потоков порта при вызове функции GetQueuedCompletionStatus. При поступлении
запроса порт разблокирует первый поток в очереди ждущих потоков и передает ему
этот запрос (в виде структуры OVERLAPPED и ключа завершения). Поток при этом
перемещается в очередь активных потоков (число активных потоков увеличивается
на 1). Предположим, у нас максимальное число активных потоков равно 1, тогда
при поступлении следующего запроса другой поток из очереди ожидающих
активирован не будет. После обработки клиентского запроса поток вновь вызывает
GetQueuedCompletionStatus и ставится в начало списка ожидающих потоков. Почему
поток ставится именно в начало списка? Дело в том, что потоки берутся из начала
списка, и при низкой активности могут использоваться не все потоки. При этом
стеки и контексты не используемых потоков могут быть выгружены на диск за
ненадобностью.
Если в процессе обработки запроса поток обратился к
блокирующей функции, число активных потоков уменьшается на 1, как если бы поток
перешел снова в очередь ожидающих потоков. Это дает возможность при приходе
следующего клиентского запроса задействовать следующий поток из очереди
ожидающих. Когда первый поток закончит блокирующую операцию, число активных
потоков превысит максимальное, и при следующем вызове функции
GetQueuedCompletionStatus один из этих потоков заблокируется, а второй получит
пакет запроса (если он имеется).
Очередь
|
Запись добавляется при:
|
Запись удаляется при:
|
Список устройств, ассоциированных с портом
|
вызове
CreateIoCompletionPort
|
закрытии хенда файла
|
Очередь клиентских запросов
(FIFO) Рекомендуем скачать другие рефераты по теме: реферати, инновационная деятельность.
Предыдущая страница реферата | 1
2
3
4
5
6
7
8
9
10
11 | Следующая страница реферата
|
|