- •Лекция 9,10. Примитивы синхронизации вWin32 api
- •Функции ожидания
- •Взаимное исключение (mutex)
- •Использование объекта mutex
- •Семафор
- •Использование семафора
- •Событие
- •Использование событий
- •Ожидаемый таймер
- •Неименованый канал (магистраль) - Anonymous pipe
- •Наследование дескрипторов
- •Именованый канал – Named Pipe
- •Пример: Многонитевой сервер каналов.
Ожидаемый таймер
"Ожидаемый" таймер - объект синхронизации, состояние которого становится «сигнализирован», когда наступает указанное время. Имеются два типа ожидаемых таймеров: со сбросом вручную и синхронизирующие. Таймер любого типа может также быть периодическим.
Таймер с ручным сбросом.Таймер, состояние которого остается «сигнализирован» до вызова SetWaitableTimer, который устанавливает новое время срабатывания.
Синхронизирующий таймер. Таймер, сигнализированное состояние которого снимается wait функцией.
Периодический таймер.Таймер, состояние которого становится сигнализированным каждый раз, когда истекает установленный период. Периодический таймер является или периодическим таймером с ручным сбросом или периодическим синхронизирующим таймером.
Нить использует функцию CreateWaitableTimer, чтобы создать объект таймера. Нить может определить имя для таймера. Нити в других процессах могут открывать дескриптор на существующий таймер, определяя имя в вызове к функции OpenWaitableTimer.
HANDLE CreateWaitableTimer(
LPSECURITY_ATTRIBUTES lpTimerAttributes, // pointer to security attributes
BOOL bManualReset, // flag for manual reset state
LPCTSTR lpTimerName // pointer to timer object name
);
Нить вызывает функцию SetWaitableTimer, чтобы инициировать таймер.
BOOL SetWaitableTimer(
HANDLE hTimer, // handle to a timer object
const LARGE_INTEGER *pDueTime, // when timer will become signaled
LONG lPeriod, // periodic timer interval
PTIMERAPCROUTINE pfnCompletionRoutine, // completion routine
LPVOID lpArgToCompletionRoutine, // data for completion routine
BOOL fResume // flag for resume system state
);
Нить может использовать функцию CancelWaitableTimer, чтобы установить таймер в неактивное состояние. Чтобы сбрасывать таймер, вызывается SetWaitableTimer. Для удаления таймера используется вызов CloseHandle.
Неименованый канал (магистраль) - Anonymous pipe
Функция CreatePipe создает неименованный канал и возвращает два дескриптора: дескрипторы чтения и записи. Для взаимодействия по каналу, необходимо передать один из дескрипторов другому процессу. Обычно, это делается через механизм наследования; то есть процесс позволяет дескриптору быть унаследованным дочерним процессом.
BOOL CreatePipe(
PHANDLE hReadPipe, // pointer to read handle
PHANDLE hWritePipe, // pointer to write handle
LPSECURITY_ATTRIBUTES lpPipeAttributes, // security attributes
DWORD nSize // pipe buffer size
);
Чтобы читать из канала, используется дескриптор чтения в запросе ReadFile. ReadFile завершается, когда другой процесс записал данные в канал. Запрос ReadFile может также завершиться, если все дескрипторы записи к каналу были закрыты или если произошла ошибка чтения.
Чтобы записывать в канал, используется дескриптор записи в запросе к функции WriteFile. Запрос WriteFile завершается, когда записано указанное число байтов или происходит ошибка. Если буфер канала полон и еще есть байты для записи, WriteFile не завершается пока другой процесс не считает из канала и не освободит достаточное место для записи оставшихся байт.
Асинхронное чтение и запись не поддерживается для неименованных каналов. Неименованный канал существует до тех пор, пока не закрыты все его дескрипторы. Процесс может закрывать дескрипторы, используя функцию CloseHandle. Все дескрипторы канала закрываются, когда процесс заканчивается.
