Операционные системы: Лабораторный практикум

Страницы работы

Фрагмент текста работы

Лабораторная работа №1

Синхронизация задач с использованием объектов-событий

Цель работы: Изучение использовать объекты-события для синхронизации работы задач.

Основные теоретические положения

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

Эффективным методом синхронизации, используемый ОС Windows, является использование объектов синхронизации, которые называется событиями. Схема использования событий достаточно проста.

Одна из задач создает обьект-событие, вызывая для этого функцию CreateEvent. При этом событие получает имя, которое доступно всем задачам активных процессов.

Вызывая функцию WaitForSingleObject или WaitForMultipleObject, задача может выполнять ожидание момента, когда событие перейдет в отмеченное состояние. Другая задача, принадлежащая тому же или иному процессу,  может получить идентификатор события по его имени, например с помощью функции OpenEvent. Далее, пользуясь функциями SetEvent, Reset Event или PulseEvent, эта задача может изменить состояние события.

Для создания события задача должна вызвать функцию CreateEvent, прототип которой приведен ниже:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES IpEventAttributes, //атрибуты защиты BOOL bManualReset,                  // флаг ручного сброса события

BOOL blnitialState,                     // флаг начального состояния события

LPCTSTR IpName);                    // адрес имени объекта-события.

Параметр IpEventAttributes задает атрибуты защиты и в большинстве случаев может быть указан как NULL.

С помощью параметра bManualReset вы можете выбрать один из двух режимов работы объекта-события: ручной. (TRUE) или автоматический (FALSE). Если задан ручной режим работы объекта-события, его нужно сбрасывать вручную при помощи функции ResetEvent. При использовании автоматического режима работы объекта-события событие будет переведено в не­отмеченное состояние (сброшено) сразу после того, как задача завершит ожи­дание этого события.

Параметр blnitialState определяет начальное состояние объекта-события: отмеченное (TRUE) или сброшенное (FALSE).

Для того чтобы объектом-событием могли пользоваться задачи, созданные разными процессами, необходимо с помощью параметра lpName задать имя события. Имя события подчиняется правилам создания имен языка С. Если событие используется в рамках одного процесса, в качестве имени события можно задать значение NULL. При этом создается безымянное событие.

В случае успешного завершения функция GreateEvent возвращает идентификатор события, который можно будет использовать во всех функциях, связанных с событием. При ошибке возвращается NULL. Если событие используется с задачами, созданными в рамках одного процесса, его не нужно открывать. Если событие используется для синхронизации задач, принадлежащих разным процессам, задача должна открыть событие при помощи функции OpenEvent:

HANDLE OpenEvent(

DWORD      fdwAccess,            // флаги доступа

BOOL  hInherit,                         //флаг наследования

LPCTSTR    lpszEventName);   // адрес имени объекта-события.

Флаги доступа, передаваемые через параметр fdwAccess, определяют требуемый уровень доступа к объекту-событию. Значение EVENT_ALL_ACCESS определяет все возможные флаги доступа.

Параметр hInherit определяет, может ли полученный

Похожие материалы

Информация о работе