Состояния дежурного ожидания
Состояния дежурного ожидания
Во всех предыдущих примерах значение параметра bAlertable, являющегося последним параметром функции SignalObjectAndWait, полагалось равным FALSE. Используя вместо него значение TRUE, мы указываем, что ожидание должно быть, как говорят, дежурным (alertable), и тогда после выполнения функции поток перейдет в состояние дежурного ожидания. В этом состоянии поток ведет себя следующим образом:
• Если один или более АРС помещаются в очередь потока (указанного в качестве целевого при вызове функции QueueUserAPC) еще до того, как либо объект, указываемый дескриптором hObjectToWaitOn (обычно таким объектом является событие), перейдет в сигнальное состояние, либо истечет интервал ожидания, то все эти потоки выполнятся (при этом не гарантируется какой-то определенный порядок их выполнения), а функция SignalObjectAndWait завершит выполнение, возвращая значение WAIT_IO_COMPLETED.
• Если АРС в очередь не помещались, то функция SignalObjectAndWait ведет себя обычным образом, то есть ожидает перехода объекта в сигнальное состояние или истечения интервала ожидания.
Состояния дежурного ожидания будут вновь использоваться нами при выполнении операций асинхронного ввода/вывода (глава 14); именно в связи с этими операциями и получило свое название значение WAIT_IO_COMPLETED. В состояние дежурного ожидания потока можно переводить также с помощью функций WaitForSingleObjectEx, WaitForMultipleObjectsEx и SleepEx, которые оказываются полезными и при выполнении операций асинхронного ввода/вывода.
Теперь можно изменить функции q_get и q_put (см. программу 10.4) таким образом, чтобы завершение работы программы после выполнения АРС было корректным, хотя АРС-функция и не выполняет никаких иных действий, кроме вывода сообщения и возврата из функции. Все, что в данном случае требуется — это организовать вход в состояние дежурного ожидания и проверить значение, возвращаемое функцией SignalObjectAndWait, как показано в приведенной ниже видоизмененной версии функции q_get (см. файл QueueObjCancel.с, находящийся на Web-сайте).
Программа 10.6. Модифицированная функция q_get, обеспечивающая корректное завершение выполнения потоков
DWORD q_put(queue_t *q, PVOID msg, DWORD msize, DWORD MaxWait) {
BOOL Cancelled = FALSE;
if (q_destroyed(q)) return 1;
WaitForSingleObject(q->q_guard, INFINITE);
while (q_full(q) && !Cancelled) {
if (SignalObjectAndWait(q->q_guard, q->q_nf, INFINITE, TRUE) == WAIT_IO_COMPLETION) {
Cancelled = TRUE;
continue;
}
WaitForSingleObject(q->q_guard, INFINITE);
}
/* Поместить сообщение в очередь. */
if (!Cancelled) {
q_remove(q, msg, msize);
/* Сигнализировать о том, что очередь не заполнена, поскольку мы удалили сообщение. */
PulseEvent(q->q_nf);
ReleaseMutex(q->q_guard);
}
return Cancelled ? WAIT_TIMEOUT : 0;
}
В качестве функции АРС могут выступать и функция ShutDownReceiver, и функция ShutDownTransmitter, поскольку приемник и передатчик используют как функцию q_get, так и функцию q_put. Если требуется, чтобы функциям завершения было известно, из какого потока они выполняются, применяйте различные значения для аргументов функций АРС, которые передаются третьим аргументом функции QueueUserAPC во фрагменте кода, предшествующем программе 10.6.
Чтобы обеспечить согласованность с предыдущими версиями программы, в качестве кода завершения следует использовать значение WAIT_TIMEOUT.
В качестве альтернативного варианта вместо проверки совпадения возвращаемого значения со значением WAIT_IO_COMPLETION можно предусмотреть генерацию исключения функциями завершения и поместить тело функции q_put в try-блок, дополнив программу обработчиком исключений.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Функции дежурного ожидания
Функции дежурного ожидания Всего предусмотрено пять функций дежурного ожидания, но ниже приводятся прототипы только трех из них, которые представляют для нас непосредственный интерес: DWORD WaitForSingleObjectEx(HANDLE hObject, DWORD dwMilliseconds, BOOL bAlertable) DWORD WaitForMultipleObjectsEx(DWORD cObjects, LPHANDLE lphObjects,
Выполнение процедуры завершения и возврат из функции дежурного ожидания
Выполнение процедуры завершения и возврат из функции дежурного ожидания По окончании выполнения операции расширенного ввода/вывода связанная с ней процедура завершения со своими аргументами, определяющими структуру OVERLAPPED, счетчик байтов и код ошибки, помещается в
Таймеры ожидания
Таймеры ожидания Windows NT поддерживает таймеры ожидания (waitable timers), являющихся одним из типов объектов ядра, осуществляющих ожидание.Вы всегда можете создать собственный сигнал синхронизации, создав синхронизирующий поток, который устанавливает событие в результате
Пример: использование таймера ожидания
Пример: использование таймера ожидания В программе 14.3 демонстрируется применение таймера ожидания для генерации периодических сигналов.Программа 14.3. TimeBeep: генерация периодических сигналов /* Глава 14. TimeBeep.с. Периодическое звуковое оповещение. *//* Использование: TimeBeep
Комментарии к примеру с таймером ожидания
Комментарии к примеру с таймером ожидания Исходя из типа таймера и используя либо процедуру завершения, либо ожидание перехода дескриптора в сигнальное состояние, можно образовать четыре различных комбинации. Программа 14.3 иллюстрирует использование процедуры
Терпимое время ожидания
Терпимое время ожидания При исследовании, проведенном в 2004 году, было установлено, что терпимое время ожидания для неработающих ссылок (без обратной связи) находилось между 5 и 8 секундами. С добавлением уведомления пользователя о процессе загрузки (обратной связи),
Функции ожидания
Функции ожидания Ожидание выполнения условия для ждущей блокировки может выполняться в двух вариантах: простое ожидание и ожидание с установкой тайм-аута.int pthread_sleepon_wait(const volatile void* addr);int pthread_sleepon_timedwait(const volatile void* addr, uint64_t nsec);При вызове функций ожидания необходимо указать
18.2.1. Режим ожидания
18.2.1. Режим ожидания Процесс, сопровождающийся запросом на невыполнение в течение определенного количества времени, называется отложенным (или "спящим"). Для режима ожидания доступны четыре функции; каждая из них измеряет время в различных единицах. Они также ведут себя и
Наращивание массы контента и ожидания от поискового продвижения
Наращивание массы контента и ожидания от поискового продвижения В условиях работы MatrixNet единственными людьми, которые более или менее достоверно знают, что происходит, являются SEO-аналитики. Это связано с тем, что при ранжировании документов учитываются сотни факторов,
Проект сдан, но ожидания заказчика не оправдались
Проект сдан, но ожидания заказчика не оправдались Еще раз напомним о необходимости иметь техническое задание, хотя даже оно не всегда гарантирует желаемый результат. Более того, формальное соответствие ТЗ может сочетаться с большим количеством недоработок (в тех местах,
Ограничение времени ожидания для транзакций (Lock timeout)
Ограничение времени ожидания для транзакций (Lock timeout) При возникновении конфликта обновления записи в InterBase возможны два варианта поведения транзакции, задаваемых параметром WAIT (isc_tpb_wait / bc_tpb_no_wait). - бесконечное ожидание разрешения конфликта или немедленная выдача ошибки.
5.2.3. Операции ожидания и установки
5.2.3. Операции ожидания и установки Каждый семафор имеет неотрицательное значение и поддерживает операции ожидания и установки. Системный вызов semop() реализует обе операции. Первым аргументом функции является идентификатор группы семафоров. Второй аргумент — это массив
Пример 9-4. Ограничение времени ожидания команды read
Пример 9-4. Ограничение времени ожидания команды read #!/bin/bash# t-out.sh TIMELIMIT=4 # 4 секундыread -t $TIMELIMIT variable <&1echoif [ -z "$variable" ]then echo "Время ожидания истекло."else echo "variable = $variable"fi exit 0$UIDuser id numberUID (идентификатор) текущего пользователя, в соответствии с /etc/passwdЭто реальный UID текущего
Время ожидания перед проверкой диска
Время ожидания перед проверкой диска При запуске операционной системы после некорректного завершения ее работы (внезапное отключение электропитания, аппаратные сбои и т. п.) включается режим автоматической проверки дисков. Однако такая проверка начинается не сразу, а
Грозовые ожидания
Грозовые ожидания Автор: Ваннах МихаилПризовем на помощь архетип… Сидишь себе в уютной пещере после хорошей порции мяса шерстистого носорога, щуришься в багрянец костра и ведешь речь о том угрожающем, что прячется в ночном лесу - хищниках, вампирах, леших… Тебе внимают -
5.3 Мониторинг состояния системы, устранение ошибок, восстановление утерянных файлов и защита данных Анализ состояния аппаратной части системы
Введение Как и всякая техника, персональный компьютер нуждается в техническом обслуживании, настройке и наладке. Небрежное отношение к своей машине приводит к тому, что работа компьютера становится нестабильной и не эффективной. А потом происходит сбой, и компьютер