Рефераты | Рефераты по информатике, программированию | Эффективная многопоточность | страница реферата 6 | Большая Энциклопедия Рефератов от А до Я
Большая Энциклопедия Рефератов от А до Я
  • Рефераты, курсовые, шпаргалки, сочинения, изложения
  • Дипломы, диссертации, решебники, рассказы, тезисы
  • Конспекты, отчеты, доклады, контрольные работы

  • Эта функция блокирует поток до тех пор, пока порт не передаст потоку пакет запроса или не истечет таймаут.

    Поместить пакет запроса в порт можно с помощью функции 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 |




    Поделитесь этой записью или добавьте в закладки

       




    Категории:



    Разделы сайта




    •