Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratorny_praktikum_Ch_1_Operatsionnye_siste.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
368 Кб
Скачать
☆

2.2. Windows

Для синхронизации процессов в Windows обычно используются события и семафоры.

События

Один из самых распространенных механизмов межпроцессной синхронизации в Windows – события. Они не являются полным аналогом unix-сигналов, представляя собой бинарные флаги, имеющие два потенциальных состояния: сигнальное и несигнальное. Событие может быть одним из двух типов: со сбросом вручную и с автосбросом.

Для создания события используется функция CreateEvent():

HANDLE CreateEvent(PSECURITY_ATTRIBUTES psa, BOOL fManualReset, BOOL fInitialState, PCTSTR pszName);

Функция принимает следующие параметры:

    • psa – атрибуты защиты;

    • fManualReset – TRUE, если событие сбрасывается вручную, FALSE в противном случае;

    • fInitialState – начальное состояние события (TRUE – сигнальное, FALSE - несигнальное);

    • pszName – уникальное имя-идентификатор события.

Получить доступ к событию из другого процесса можно одним из следующих способов:

    • вызвать функцию CreateEvent() с тем же именем, которое было присвоено событию первым процессом;

    • унаследовать дескриптор;

    • применить функцию DuplicateHandle();

    • вызвать функцию OpenEvent() с указанием имени существующего события.

Управлять состоянием события позволяют функции: SetEvent() – переводит событие в сигнальное состояние, и ResetEvent() – в несигнальное. Для ожидания события используется функция WaitForSingleObject(). Если событие создано с флагом автосброса, то при успешном окончании ожидания событие автоматически переведется в несигнальное состояние.

Семафоры

Второй рассматриваемый тип синхронизирующих объектов в Windows – семафоры. Принципиальных различий между семафорами в Unix и Windows не так много. Основное различие для программиста заключается в инструментальных средствах управления семафорами.

В Windows семафор создается функцией CreateSemaphore():

HANDLE CreateSemaphore( PSECURITY_ATTRIBUTE psa, LONG lInitialCount, LONG lMaximumCount, PCTRTR pszName);

Функция принимает следующие параметры:

    • psa – атрибуты защиты;

    • fManualReset – TRUE, если событие сбрасывается вручную, FALSE – в противном случае;

    • lInitialCount – начальное значение счетчика семафора;

    • lMaxCount – максимальное значение счетчика семафора;

    • pszName – уникальное имя-идентификатор события.

Очевидно, что в отличие от Linux, Windows оперирует не наборами, а отдельными семафорами. Унаследовать созданный семафор можно теми же методами, что и событие. Для открытия семафора можно использовать функцию OpenSemaphore().

При вызове функции ReleaseSemaphore() значение счетчика ресурсов увеличивается. При этом его можно изменить не только на 1, как это обычно делается, но и на любое другое значение.

Дождаться освобождения ресурса (ненулевого состояния семафора) можно при помощи функций WaitForSingleObject(), WaitForMultipleObjects(), MsgWaitForMultipleObjects(). При этом счетчик ресурсов автоматически будет уменьшен на единицу.