C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Использование семафора при помощи API-функций / Использование API / Visual C++ .NET

Использование семафора при помощи API-функций

Семафор представляет собой глобальный объект, позволяющий синхронизировать работу двух или нескольких процессов или потоков. Для программиста семафор - это просто счетчик. Если счетчик равен N, это означает, что к ресурсу имеют доступ N процессов. Рассмотрим функции для работы с семафорами.

CreateSemaphor - создаёт глобальный объект-семафор. Возвращает дескриптор семафора.

HANDLE CreateSemaphore
(
 LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
 LONG lInitialCount,
 LONG lMaximumCount,
 LPCTSTR lpName
)

Первый параметр - указатель на структуру, определяющую атрибуты доступа. Может иметь значение для Windows NT. Обычно данный параметр равен NULL.
Второй параметр - начальное значение счётчика семафора. Определяет, сколько задач имеют доступ к ресурсу в начале.
Третий параметр - количество задач, которые имеют одновременный доступ к ресурсу.
Четвёртый параметр - указатель на строку, содержащую имя семафора.

OpenSemaphor - открыть уже созданный семафор. Возвращает дескриптор семафора. Данную функцию используют не так часто. Обычно создают семафор и присваивают его дескриптор глобальной переменной, а потом используют этот дескриптор в порождаемых потоках.

HANDLE OpenSemaphore
(
 DWORD dwDesiredAccess,
 BOOL bInheritHandle,
 LPCTSTR lpName
)

Параметры функции: первый параметр - определяет желаемый уровень доступа к семафору. Возможны значения: SEMAPHORE_MODiFY_STATE = 2H, разрешить использование функции ReleaseSemaphore, SYNCHRONIZE = 100000H, разрешить использование любой функции ожидания, только для Windows NT, SEMAPHORE_ALLACCESS = 0F0000h+ SYNCHRONIZE+3H, специфицирует все возможные флаги доступа к семафору.

WaitForSingleObject – ожидать открытие семафора. При успешном завершении, т. е. открытии доступа к объекту, функция возвращает 0. Значение 102h будет означать, что заданный период ожидания.

DWORD WaitForSingleObject
(
 HANDLE hHandle,
 DWORD dwMilliseconds
)

Первый параметр – дескриптор семафора.
Второй параметр – время ожидания в миллисекундах. Если параметр равен INFINITE = 0FFFFFFFFh, то время ожидания не ограничено.

ReleaseSemaphore – освободить семафор и позволить получить доступ к ресурсу другим процессам.

BOOL ReleaseSemaphore
(
 HANDLE hSemaphore,
 LONG lReleaseCount,
 LPLONG lpPreviousCount
)

Первый параметр – дескриптор семафора.
Второй параметр – определяет какое значение должно быть добавлено к счетчику семафора. Чаще всего этот параметр равен единице.
Третий параметр – указатель на переменную, куда должно быть перемещено предыдущее значение счетчика.

Рассмотрим алгоритм работы с семафором. Сначала при помощи функции CreateSemaphore создадим семафор, и его дескриптор присваивается глобальной переменной. Пред попыткой обращения к ресурсам доступ, к которым необходимо ограничить, поток должен вызвать функцию WaitForSingleObject. При открытии доступа функция возвращает 0. По окончании работы с ресурсом следует вызвать функцию ReleaseSemaphor. Тем самым увеличивается счётчик доступа на 1. С помощью семафора можно регулировать количество потоков, которые одновременно могут иметь доступ к ресурсу. Максимальное значение счетчика как раз и определяет, сколько потоков могут получить доступ к ресурсу одновременно. Но обычно, как мы уже говорили, максимальное значение полагают равным 1.