К Т П           План занятия                                                              1                                           Страницы  | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 |

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

Функции ожидания в Windows это такие функции, параметрами которых являются объекты синхронизации. Эти функции обычно используются для блокировки потоков. Сама блокировка потока выполняется следующим образом. Если дескриптор объекта синхронизации является параметром функции ожидания, а сам объект синхронизации находится в несигнальном состоянии, то поток, вызвавший эту функцию ожидания, блокируется до перехода этого объекта синхронизации в сигнальное состояние. Сейчас мы будем использовать только две функции ожидания WaitForSingleObject и WaitForMultipleObject. Остальные функции ожидания будут описаны в части, посвященной асинхронному вызову процедур в Windows.

Для ожидания перехода в сигнальное состояние одного объекта синхронизации используется функция WaitForSingleObject, которая имеет следующий прототип:

DWORD WaitForSingleObject(
     HANDLE hHandle, // дескриптор объекта
     DWORD dwMilliseconds // интервал ожидания в миллисекундах
   ) ;

Функция 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. Также отметим, что объекты синхронизации не должны повторяться.
В случае успешного завершения функция WaitForMuitipieObjects возвращает следующие значения:

- ОТ WAIT_OBJECT_0 ДО (WAIT_OBJECT_0 + nCount - 1);
- ОТ WAIT_ABANDONED_0 ДО {WAIT_ABANDONED_0 + nCount - 1);
- WAIT_TIMEOUT.

Интерпретация значений, возвращаемых функцией WaitForMuitipieObjects, зависит от значения входного параметра bWaitAii. Сначала рассмотрим случай, когда значение этого параметра равно true. Тогда возвращаемые значения интерпретируются следующим образом:
- любое из возвращаемых значений, находящихся в диапазоне от WAIT_OBJECT_O до (WAIT_OBJECT_O + nCount - i), означает, что все объекты синхронизации находились или перешли в сигнальное состояние;
- любое из возвращаемых значений, находящихся в диапазоне от
WАIТ_АВANDONЕD_0 ДО (WAIT_АВANDONЕD_0 + nCount - 1), означает, что все объекты синхронизации находились или перешли в сигнальное со стояние и по крайней мере один их них был забытым мьютексом;
- возвращаемое значение WAIT_TIMEOUT означает, что время ожидания истекло и не все объекты синхронизации перешли в сигнальное состояние.

Теперь рассмотрим случай, когда значение входного параметра bWaitAii равно FALSE. В этом случае значения, возвращаемые функцией WaitForMuitipieObjects, интерпретируются следующим образом:
-  любое из возвращаемых значений, находящихся в диапазоне от WAIT_OBJECT_O до (WAIT_OBJECT_O + nCount - 1), означает, что, по крайней мере, один из объектов синхронизации находился или перешел в сигнальное состояние. Индекс дескриптора этого объекта в массиве определяется как разница между возвращаемым значением и величиной WAIT_OBJECT_O ;
-  любое из возвращаемых значений, находящихся в диапазоне от WАIТ_АВANDONЕD_0 до (WAIT_ АВANDONЕD_ 0 + nCount - 1), означает, что одним из объектов синхронизации, перешедшим в сигнальное состояние, является забытый мьютекс. Индекс дескриптора этого мьютекса в массиве определяется как разница между возвращаемым значением и величиной WAIT_OBJECT_O ;
- возращаемое значение wait_timeout означает, что время ожидания истекло, и ни один из объектов синхронизации не перешел в сигнальное состояние.

В случае неудачи функция waitForMuitipieObjects возвращает значение WAIT FAILED.


Предыдущая        В начало страницы       Следующая
3