Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ ОС ЭКЗАМЕН.docx.doc
Скачиваний:
2
Добавлен:
16.09.2019
Размер:
185.86 Кб
Скачать

21. Использование Event для синхронизации. Функции:

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

Разница в том, что первый вид события нужно применять если событие ждут несколько потоков. Только сброс в ручную поволяет это сделать. Иначе первый же обработчик сбросит событие и другие потоки об этом не узнают. Реализуется это так. Объявляется переменная события типа HANDLE. Для создания события используется функция CreateEvent(), для доступа OpenEvent(), для установки события две функции SetEvent() и PulseEvent(). Для сброса события используется функция ResetEvent(). Дескриптор события после окончания работы нужно закрыть. Объект событие может находиться в двух состояниях - занят и свободен.

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES

lpEventAttributes, //игнорируеться, должно быть null

BOOL bManualReset, //true – сброс в ручную, false - автоматически

BOOL InitialState, //начальное состояние объекта

LPTSTR lpName //имя объекта события

);

BOOL WINAPI SetEvent(

HANDLE hEvent //Дескриптор события объекта

);

BOOL WINAPI ResetEvent(

HANDLE hEvent //Дескриптор события объекта

);

DWORD WINAPI WaitForSingleObject(

HANDLE hHandle, //Дескриптор объекта

DWORD dwMilliseconds //Таймаут в миллисекундах

);

BOOL WINAPI CloseHandle(

HANDLE hObject //Дескриптор открытого объекта

);

22. Использование Semaphore для синхронизации. Функции:

Данный объект синхронизации позволяет ограничить доступ потоков к объекту синхронизации на основании их количества. Например, мы хотим, чтобы к какому-нибудь объекту могли обратиться максимум 3 потока. Не больше. Тогда нам нужен семафор. Сначала семафор инициализируется и ему передается количество потоков, которые к нему могут обратиться. Дальше при каждом обращении к ресурсу его счетчик уменьшается. Когда счетчик уменьшиться до 0 к ресурсу обратиться больше нельзя. При отсоединении потока от семафора его счетчик увеличивается, что позволяет другим потокам обратиться к нему. Сигнальному состоянию соответствует значение счетчика больше нуля. Когда счетчик равен нулю, семафор считается не установленным (сброшенным).

Сначала нам нужно создать семафор, а для этого есть функция CreateSemaphore(). Эта функция создает семафор с заданным начальным значением счетчика и максимальным значением. Это значение ограничивает доступ. Функция OpenSemaphore() осуществляет доступ к семафору. Функция ReleaseSemaphore() увеличивает значение счетчика. Счетчик может меняться от 0 до максимального значения. После завершения работы достаточно вызвать CloseHandle().

HANDLE WINAPI CreateSemaphore(

LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //указатель на структуру

LONG lInitialCount, //первоначальное количество потоков в семафоре

LONG lMaximumCount, //максимальное количство потоков в семафоре

LPCTSTR lpName //Имя семафора объекта

);

BOOL WINAPI ReleaseSemaphore(

HANDLE hSemaphore, //Дескриптор семафора

LONG lReleaseCount, //Количество на которое будет увеличено количество потоков в семафоре

LPLONG lpPreviousCount //Предедущее значение семафора

);

DWORD WINAPI WaitForSingleObject(

HANDLE hHandle, //Дескриптор объекта

DWORD dwMilliseconds //Таймаут в миллисекундах

);

BOOL WINAPI CloseHandle(

HANDLE hObject //Дескриптор открытого объекта

);