|
|
||
3. Функции ожидания |
||
Функции ожидания в Windows это такие функции, параметрами которых являются объекты синхронизации. Эти функции обычно используются для блокировки потоков. Сама блокировка потока выполняется следующим образом. Если дескриптор объекта синхронизации является параметром функции ожидания, а сам объект синхронизации находится в несигнальном состоянии, то поток, вызвавший эту функцию ожидания, блокируется до перехода этого объекта синхронизации в сигнальное состояние. Сейчас мы будем использовать только две функции ожидания WaitForSingleObject и WaitForMultipleObject. Остальные функции ожидания будут описаны в части, посвященной асинхронному вызову процедур в Windows. Для ожидания перехода в сигнальное состояние одного объекта синхронизации используется функция WaitForSingleObject, которая имеет следующий прототип:
DWORD WaitForSingleObject( Функция WaitForSingleObject в течение интервала времени, равного значению параметра dwMilliseconds, ждет перехода объекта синхронизации, дескриптор которого задается параметром hHandle, в сигнальное состояние. Если значение параметра dwMilliseconds равно нулю, то функция только проверяет состояние объекта синхронизации. Если же значение параметра dwMilliseconds равно infinite, то функция ждет перехода объекта синхронизации в сигнальное состояние бесконечно долго. В случае успешного завершения функция WaitForSingleObject возвращает одно из следующих значений: |
||
| - WAIT_OBJECT_0 — объект перешел в сигнальное состояние; - WAIT_ABANDONED — забытый мьютекс; - WAIT_TIMEOUT — время ожидания истекло. Значение WAIT_OBJECT_0 означает, что объект синхронизации находился или перешел в сигнальное состояние. Значение WAIT_ABANDONED означает, что объектом синхронизации являлся мьютекс, который не освободился завершившимся потоком. В этом случае мьютекс освобождается операционной системой и поэтому также переходит в сигнальное состояние. Такой мьютекс иногда называется забытый или заброшенный мьютекс (abandoned mutex). Значение WAIT_TIMEOUT означает, что время ожидания истекло, а объект синхронизации так и не перешел в сигнальное состояние. В случае неудачи функция waitForSingieObject возвращает значение WAIT_FAILED. Функция waitForMuitipieObjects работает следующим образом. Если значение параметра bwaitAii равно true, то эта функция в течение интервала времени, равного значению параметра dwMiliiseconds, ждет пока все объекты синхронизации, дескрипторы которых заданы в массиве lpHandies, перейдут в сигнальное состояние. Если же значение параметра bwaitAii равно FALSE, то эта функция в течение заданного интервала времени ждет, пока любой из заданных объектов синхронизации перейдет в сигнальное состояние. Если значение параметра dwMiliiseconds равно нулю, то функция только проверяет состояние объектов синхронизации. Если же значение параметра dwMiliiseconds равно INFINITE, то функция ждет перехода объектов синхронизации в сигнальное состояние бесконечно долго. Количество объектов синхронизации, ожидаемых функцией WaitForMuitipieObjects,
не должно превышать значения MAXIMUM_WAIT_OBJECTS. Также отметим, что объекты синхронизации не должны повторяться. |
||
| - ОТ WAIT_OBJECT_0 ДО (WAIT_OBJECT_0 + nCount - 1); - ОТ WAIT_ABANDONED_0 ДО {WAIT_ABANDONED_0 + nCount - 1); - WAIT_TIMEOUT. Интерпретация значений, возвращаемых функцией WaitForMuitipieObjects, зависит от значения входного параметра bWaitAii. Сначала рассмотрим случай, когда значение этого параметра равно true. Тогда возвращаемые значения интерпретируются следующим образом: Теперь рассмотрим случай, когда значение входного параметра bWaitAii равно FALSE. В этом случае значения, возвращаемые функцией WaitForMuitipieObjects, интерпретируются следующим образом: В случае неудачи функция waitForMuitipieObjects возвращает значение WAIT FAILED. |
||
3 |