Рефераты | Рефераты по информатике, программированию | Эффективная многопоточность
Эффективная многопоточность
Категория реферата: Рефераты по информатике, программированию
Теги реферата: аристотель реферат, реферати українською
Добавил(а) на сайт: Bonch-Bruevich.
Функция вопросов не вызывает, однако нужно отметить, что она не оказывает влияния на «одноразовые» (one-shot) таймеры, при создании
которых в качестве периода был указан 0.
Характеристика
Значение
Начальное коли-чество
потоков в пуле
1
Когда поток удаляется
Когда удаляется последний
таймер из очереди
Способ ожидания, используемый потоком
Тревожное (alertable)
ожидание
Поток просыпается при
Приходе APC-запроса
Таблица 7. Описание характеристик работы объекта
"очередь таймеров".
Вызов функции при переходе объекта в сигнальное
состояние
В приложении часто возникает необходимость дождаться
какого-либо объекта и выполнить определенное действие. Для многопоточных
приложений приходится для каждого такого случая заводить отдельный поток, что
нехорошо. В этом случае на помощь приходит функция RegisterWaitForSingleObject.
Она позволяет вызывать произвольную пользовательскую функцию после того, как
заданный объект перейдет в сигнальное состояние. Причем никаких потоков
создавать не нужно, все делается автоматически. Рассмотрим прототип этой
функции:
BOOL
RegisterWaitForSingleObject(
PHANDLE phNewWaitObject, // адрес хендла объекта ожидания
HANDLE hObject, // хендл объекта
WAITORTIMERCALLBACK Callback, // функция обратного вызова
PVOID Context // произвольный параметр
ULONG dwMilliseconds, // таймаут
ULONG dwFlags // флаги
);
Первый параметр – это указатель на переменную, в
которую будет возвращен хендл объекта ожидания. Нужно отметить, что на самом
деле это не хендл объекта и его нельзя использовать, например, с функцией
CloseHandle. Этот хендл можно использовать только для передачи функции
UnregisterWait или UnregisterWaitEx (о них поговорим попозже). В качестве
второго параметра нужно передать хендл объекта, перехода которого в сигнальное
состояние ожидает эта функция. Третий параметр – адрес функции
WaitOrTimerCallback, которую мы описывали раньше. Четвертый параметр – это
любое значение, которое просто передается функции WaitOrTimerCallback. В
качестве пятого параметра можно указать количество миллисекунд, которое
определяет максимальное время ожидания объекта. После его истечения функция
WaitOrTimerCallback будет вызвана со вторым параметром, равным TRUE. Если
объект перешел в сигнальное состояние до истечения кванта времени, второй
параметр функции WaitOrTimerCallback будет равным FASLE.
В качестве флагов можно указывать все описанные ранее
значения и одно новое – WT_EXECUTEINWAITTHREAD. Его можно использовать, только
если вы выполняете очень короткие операции, функция WaitOrTimerCallback будет
вызвана в самом ожидающем потоке. Любая задержка в пользовательской функции
приведет к тому, что поток не сможет обработать переход в сигнальное состояние
объекта вовремя. Замечу, что при ожидании сигнального состояния события с
ручным сбросом (manual reset event) не следует вызывать функцию PulseEvent, если не указаны флаги WT_EXECUTEINWAITTHREAD или WT_EXECUTEONLYONCE, так как в
этом случае ожидающий поток не сможет обработать событие перехода объекта в
сигнальное состояние.
Рекомендуем скачать другие рефераты по теме: реферати, инновационная деятельность.