Реферат: Эффективная многопоточность
OUT PVOID IoCompletionInformation,
IN ULONG IoCompletionInformationLength,
OUT PULONG ResultLength OPTIONAL
);
static ZwQueryIoCompletion_t* ZwQueryIoCompletion = 0;
if(!ZwQueryIoCompletion)
{
ZwQueryIoCompletion = (ZwQueryIoCompletion_t*)GetProcAddress(
GetModuleHandle(_T("ntdll.dll")), _T("NtQueryIoCompletion"));
}
NT::IO_COMPLETION_BASIC_INFORMATION ioinfo = {0};
DWORD dwRetLen = 0;
ZwQueryIoCompletion(hIoPort, NT::IoCompletionBasicInformation,
&ioinfo, sizeof ioinfo, &dwRetLen);
return ioinfo.SignalState;
}
Как видите, не простое это дело – создавать эффективный пул потоков, однако кое-что ребята из Microsoft могут нам предложить. В Windows 2000 появились новые функции, которые полностью берут на себя всю черновую работу по созданию и удалению потоков в пуле. О них – следующий раздел.
Встроенная поддержка пула потоков
В Windows 2000 появились новые функции, которые условно можно разделить на четыре группы:
помещение запроса в очередь;
вызов функции при окончании асинхронной операции ввода/вывода;
периодический вызов функции;
вызов функции при переходе объекта в сигнальное состояние.
Рассмотрим их по порядку.
Помещение запроса в очередь
Передать на выполнение потоку из пула какую-либо функцию можно с помощью сервиса QueueUserWorkItem. Эта с виду простая функция делает очень много: она создает порт завершения ввода/вывода, создает и уничтожает потоки в пуле и многое другое. Вот ее описание:
BOOL QueueUserWorkItem( LPTHREAD_START_ROUTINE Function, // адресфункции PVOID Context, // произвольный параметр К-во Просмотров: 409
Бесплатно скачать Реферат: Эффективная многопоточность
|