Состояния дежурного ожидания

Состояния дежурного ожидания

Во всех предыдущих примерах значение параметра 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-блок, дополнив программу обработчиком исключений. 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Грозовые ожидания

Из книги Журнал `Компьютерра` N735 автора Журнал «Компьютерра»

Грозовые ожидания Автор: Ваннах МихаилПризовем на помощь архетип… Сидишь себе в уютной пещере после хорошей порции мяса шерстистого носорога, щуришься в багрянец костра и ведешь речь о том угрожающем, что прячется в ночном лесу - хищниках, вампирах, леших… Тебе внимают -


Терпимое время ожидания

Из книги Разгони свой сайт автора Мациевский Николай

Терпимое время ожидания При исследовании, проведенном в 2004 году, было установлено, что терпимое время ожидания для неработающих ссылок (без обратной связи) находилось между 5 и 8 секундами. С добавлением уведомления пользователя о процессе загрузки (обратной связи),


Проект сдан, но ожидания заказчика не оправдались

Из книги Продвижение бизнеса в Интернет. Все о PR и рекламе в сети автора Гуров Филипп

Проект сдан, но ожидания заказчика не оправдались Еще раз напомним о необходимости иметь техническое задание, хотя даже оно не всегда гарантирует желаемый результат. Более того, формальное соответствие ТЗ может сочетаться с большим количеством недоработок (в тех местах,


Время ожидания перед проверкой диска

Из книги Тонкости реестра Windows Vista. Трюки и эффекты автора Клименко Роман Александрович

Время ожидания перед проверкой диска При запуске операционной системы после некорректного завершения ее работы (внезапное отключение электропитания, аппаратные сбои и т. п.) включается режим автоматической проверки дисков. Однако такая проверка начинается не сразу, а


Функции дежурного ожидания

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Функции дежурного ожидания Всего предусмотрено пять функций дежурного ожидания, но ниже приводятся прототипы только трех из них, которые представляют для нас непосредственный интерес:  DWORD WaitForSingleObjectEx(HANDLE hObject, DWORD dwMilliseconds, BOOL bAlertable) DWORD WaitForMultipleObjectsEx(DWORD cObjects, LPHANDLE lphObjects,


Выполнение процедуры завершения и возврат из функции дежурного ожидания

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Выполнение процедуры завершения и возврат из функции дежурного ожидания По окончании выполнения операции расширенного ввода/вывода связанная с ней процедура завершения со своими аргументами, определяющими структуру OVERLAPPED, счетчик байтов и код ошибки, помещается в


Таймеры ожидания

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Таймеры ожидания Windows NT поддерживает таймеры ожидания (waitable timers), являющихся одним из типов объектов ядра, осуществляющих ожидание.Вы всегда можете создать собственный сигнал синхронизации, создав синхронизирующий поток, который устанавливает событие в результате


Пример: использование таймера ожидания

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Пример: использование таймера ожидания В программе 14.3 демонстрируется применение таймера ожидания для генерации периодических сигналов.Программа 14.3. TimeBeep: генерация периодических сигналов /* Глава 14. TimeBeep.с. Периодическое звуковое оповещение.  *//* Использование: TimeBeep


Комментарии к примеру с таймером ожидания

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Комментарии к примеру с таймером ожидания Исходя из типа таймера и используя либо процедуру завершения, либо ожидание перехода дескриптора в сигнальное состояние, можно образовать четыре различных комбинации. Программа 14.3 иллюстрирует использование процедуры


18.2.1. Режим ожидания

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

18.2.1. Режим ожидания Процесс, сопровождающийся запросом на невыполнение в течение определенного количества времени, называется отложенным (или "спящим"). Для режима ожидания доступны четыре функции; каждая из них измеряет время в различных единицах. Они также ведут себя и


Функции ожидания

Из книги Домашний доктор для вашего ПК автора Виноградов Алексей Степанович

Функции ожидания Ожидание выполнения условия для ждущей блокировки может выполняться в двух вариантах: простое ожидание и ожидание с установкой тайм-аута.int pthread_sleepon_wait(const volatile void* addr);int pthread_sleepon_timedwait(const volatile void* addr, uint64_t nsec);При вызове функций ожидания необходимо указать


Пример 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 текущего


Ограничение времени ожидания для транзакций (Lock timeout)

Из книги автора

Ограничение времени ожидания для транзакций (Lock timeout) При возникновении конфликта обновления записи в InterBase возможны два варианта поведения транзакции, задаваемых параметром WAIT (isc_tpb_wait / bc_tpb_no_wait). - бесконечное ожидание разрешения конфликта или немедленная выдача ошибки.


5.2.3. Операции ожидания и установки

Из книги автора

5.2.3. Операции ожидания и установки Каждый семафор имеет неотрицательное значение и поддерживает операции ожидания и установки. Системный вызов semop() реализует обе операции. Первым аргументом функции является идентификатор группы семафоров. Второй аргумент — это массив


5.3 Мониторинг состояния системы, устранение ошибок, восстановление утерянных файлов и защита данных Анализ состояния аппаратной части системы

Из книги автора

Введение Как и всякая техника, персональный компьютер нуждается в техническом обслуживании, настройке и наладке. Небрежное отношение к своей машине приводит к тому, что работа компьютера становится нестабильной и не эффективной. А потом происходит сбой, и компьютер


Наращивание массы контента и ожидания от поискового продвижения

Из книги автора

Наращивание массы контента и ожидания от поискового продвижения В условиях работы MatrixNet единственными людьми, которые более или менее достоверно знают, что происходит, являются SEO-аналитики. Это связано с тем, что при ранжировании документов учитываются сотни факторов,