Реферат: Эффективная многопоточность

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
Бесплатно скачать Реферат: Эффективная многопоточность