КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
HANDLE OpenSemaphore(DWORD fdwAccess, BOOL bInhentHandle, PCTSTR pszName);Параметр lMaximumCount сообщает системе максимальное число ресурсов, обрабатываемое приложением. Поскольку это 32-битное значение со знаком, предельное число ресурсов может достигать 2 147 483 647. Параметр UnitialCount указывает, сколько из этих ресурсов доступно изначально (на данный момент). Инициализации серверного процесса, клиентских запросов нет CreateSemaphore так: HANDLE hSem = GreateSemaphore(NULL, 0, 5. NULL), Создаётся семафора со счетчиком максимального числа ресурсов, равным 5, при этом изначально ни один ресурс не доступен. Поскольку счетчику текущего числа ресурсов присвоено, семафор находится в занятом состоянии. А это значит, что любой поток, ждущий семафор, просто засыпает. Поток получает доступ к ресурсу, вызывая одну из Wait-функций и передавая ей описатель семафора, который охраняет этот ресурс. Wait-функция проверяет у семафора счетчик текущего числа ресурсов: если его значение больше 0 (семафор свободен), уменьшает значение этого счетчика на 1, и вызывающий поток остается планируемым. Очень важно, что семафоры выполняют эту операцию проверки и присвоения на уровне атомарного доступа; иначе говоря, когда Вы запрашиваете у семафора какой-либо ресурс, операционная система проверяет, доступен ли этот ресурс, и, если да, уменьшает счетчик текущего числа ресурсов, не позволяя вмешиваться в эту операцию другому потоку. Только после того как счетчик ресурсов будет уменьшен на 1, доступ к ресурсу сможет запросить другой поток. Если Wait-функция определяет, что счетчик текущего числа ресурсов равен 0 (семафор занят), система переводит вызывающий поток в состояние ожидания. Когда другой поток увеличит значение этого счетчика, система вспомнит о ждущем потоке и снова начнет выделять ему процессорное время (а он, захватив ресурс, уменьшит значение счетчика на 1). Поток увеличивает значение счетчика текущего числа ресурсов, вызывая функцию ReleaseSemaphore: BOOL ReleaseSemaphore(HANDLE hSem,LONG lReleaseCount,PLONQ plPreviousCount); № 17 Использование мъютексов для синхронизации Объекты ядра “мьютексы” гарантируют потокам взаимоисключающий доступ к единственному ресурсу. Они содержат счетчик числа пользователей, счетчик рекурсии и переменную, в которой запоминается идентификатор потока. Мьютексы ведут себя точно так же, как и критические секции. Но критические секции(объектами пользовательского режима), а мьютексы — объектами ядра.Единственный объект- мьютекс позволяет синхронизировать доступ к ресурсу нескольких потоков из разных процессов; при этом можно задать максимальное время ожидания доступа к ресурсу. Идентификатор потока определяет, какой поток захватил мьютекс, а счетчик рекурсий — сколько раз. С их помощью защищают блок памяти, к которому обращается множество потоков. Мьютексы гарантируют, что любой поток получает монопольный доступ к блоку памяти, и тем самым обеспечивают целостность данных. Для мьютексов определены следующие правила: 1. если его идентификатор потока равен 0 (у самого потока не может быть такой идентификатор), мьютекс не захвачен ни одним из потоков и находится в свободном состоянии; 2. если его идентификатор потока не равен 0, мьютекс захвачен одним из потоков и находится в занятом состоянии; 3. в отличие от других объектов ядра мьютексы могут нарушать обычные правила, действующие в операционной системе. Для использования объекта-мьютекса один из процессов должен сначала создать его вызовом CreateMutex:
|