Лабораторная работа №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 определяет, может ли полученный
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.