Эффективная многопоточность
Категория реферата: Рефераты по информатике, программированию
Теги реферата: аристотель реферат, реферати українською
Добавил(а) на сайт: Bonch-Bruevich.
Предыдущая страница реферата | 9 10 11 12 13 14 15 16 17 18 19 | Следующая страница реферата
вызов функции при окончании асинхронной операции ввода/вывода;
периодический вызов функции;
вызов функции при переходе объекта в сигнальное состояние.
Рассмотрим их по порядку.
Помещение запроса в очередь
Передать на выполнение потоку из пула какую-либо функцию можно с помощью сервиса QueueUserWorkItem. Эта с виду простая функция делает очень много: она создает порт завершения ввода/вывода, создает и уничтожает потоки в пуле и многое другое. Вот ее описание:
BOOL QueueUserWorkItem( LPTHREAD_START_ROUTINE Function, // адрес функции PVOID Context, // произвольный параметр ULONG Flags // флаги выполнения ); |
QueueUserWorkItem помещает пакет запроса в виде адреса функции и произвольного параметра в очередь запросов порта завершения и сразу же возвращает управление. Вот как выглядит функция, которая будет вызвана одним из потоков в пуле:
DWORD WINAPI ThreadProc( LPVOID lpParameter // произвольный параметр ); |
Ее прототип ничем не отличается от стартовой процедуры потока, так что здесь вам все должно быть ясно. Гораздо интереснее знать, что скрывается внутри функции QueueUserWorkItem. Давайте разбираться.
При первом помещении запроса количество потоков в пуле равно нулю, так что QueueUserWorkItem приходится создавать поток и порт завершения. Затем в порт помещается пакет запроса, а поток вызывает функцию GetQueuedCompletionStatus. После обработки запроса поток не разрушается, а остается еще некоторое время в пуле, так что следующий запрос обработается намного быстрее. Если вы отправляете запросы слишком часто, и количество необработанных пакетов увеличивается, QueueUserWorkItem создаст для вызова функции новый поток. Максимальное количество потоков в пуле равно количеству процессоров, что не очень хорошо, но есть способ заставить функцию всегда создавать новый поток.
ПРИМЕЧАНИЕ Те из вас, кто читал статью Дж. Рихтера «New Windows 2000 Pooling Functions Greatly Simplify Thread Management» из апрельского MSJ за 1999 год, могут поспорить со мной насчет размера пула. В статье указывается, что количество потоков в нем равно удвоенному количеству процессоров в системе, однако это не так. Вы можете собственноручно в этом убедиться, поставив breakpoint на функцию _RtlpInitializeWorkerThreadPool (адрес 0x77FA95CD на Windows 2000 Professional SP3) и вызвав функцию QueueUserWorkItem. |
Рассмотрим флаги функции QueueUserWorkItem.
Константа |
Значение |
Описание |
|||
WT_EXECUTEDEFAULT |
0 Рекомендуем скачать другие рефераты по теме: реферати, инновационная деятельность. Предыдущая страница реферата | 9 10 11 12 13 14 15 16 17 18 19 | Следующая страница реферата Поделитесь этой записью или добавьте в закладкиКатегории: |