Класс CSemaphore
Объект класса CSemaphore
представляет собой объект семафора — объект синхронизации, который позволяет ограниченному количеству потоков в одном или нескольких процессах получить доступ к количеству потоков, которые в настоящее время обращаются к указанному ресурсу.
Синтаксис
class CSemaphore : public CSyncObject
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CSemaphore::CSemaphore | Формирует объект CSemaphore . |
Замечания
Семафоры полезны при управлении доступом к общему ресурсу, который может поддерживать только ограниченное количество пользователей. Текущее число CSemaphore
объектов — это число разрешенных дополнительных пользователей. Когда число достигает нуля, все попытки использовать ресурс, контролируемый CSemaphore
объектом, будут вставлены в системную очередь и подождите, пока не истекает время ожидания, или число увеличивается выше 0. Максимальное количество пользователей, которые могут получить доступ к управляемому ресурсу за один раз, указывается во время строительства CSemaphore
объекта.
Чтобы использовать CSemaphore
объект, создайте CSemaphore
объект при необходимости. Укажите имя семафора, на которое вы хотите ждать, и что ваше приложение должно изначально владеть им. Затем вы можете получить доступ к семафору при возврате конструктора. Вызовите CSyncObject::Разблокируйте , когда вы закончите доступ к управляемому ресурсу.
Альтернативным способом использования CSemaphore
объектов является добавление переменной типа CSemaphore
в качестве элемента данных в класс, который вы хотите контролировать. Во время построения управляемого объекта вызовите конструктор CSemaphore
элемента данных, указав начальное число доступа, максимальное число доступа, имя семафора (если оно будет использоваться через границы процесса) и требуемые атрибуты безопасности.
Чтобы получить доступ к ресурсам, контролируемым CSemaphore
объектами таким образом, сначала создайте переменную типа CSingleLock или тип CMultiLock в функции-члене ресурса. Затем вызовите функцию-член объекта Lock
блокировки (например, CSingleLock::Lock). На этом этапе поток получит доступ к ресурсу, подождите, пока ресурс будет освобожден и получите доступ, или дождитесь освобождения ресурса и истечения времени ожидания, не получая доступа к ресурсу. В любом случае ресурс был доступ к ресурсу в потокобезопасном режиме. Чтобы освободить ресурс, используйте функцию-член объекта Unlock
блокировки (например, CSingleLock::Unlock) или разрешите объекту блокировки выйти из области.
Кроме того, можно создать автономный CSemaphore
объект и получить к нему явный доступ, прежде чем пытаться получить доступ к управляемому ресурсу. Этот метод, хотя и более понятный для того, кто читает исходный код, более подвержен ошибке.
Дополнительные сведения об использовании CSemaphore
объектов см. в статье "Многопоточность: использование классов синхронизации".
Иерархия наследования
CSemaphore
Требования
Заголовок: afxmt.h
CSemaphore::CSemaphore
Создает именованный или неименованный CSemaphore
объект.
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
Параметры
lInitialCount
Начальное количество использования для семафора. Должно быть больше или равно 0 и меньше или равно lMaxCount.
lMaxCount
Максимальное количество использования для семафора. Должно быть больше 0.
pstrName
Имя семафора. Необходимо предоставить, если семафор будет доступ к семафору через границы процесса. Если NULL
объект не будет именован. Если имя соответствует существующему семафору, конструктор создает новый CSemaphore
объект, который ссылается на семафор этого имени. Если имя соответствует существующему объекту синхронизации, который не является семафором, конструкция завершится ошибкой.
lpsaAttributes
Атрибуты безопасности для объекта семафора. Полное описание этой структуры см. в SECURITY_ATTRIBUTES в пакете SDK для Windows.
Замечания
Чтобы получить доступ к объекту CSemaphore
или освободить его, создайте объект CMultiLock или CSingleLock и вызовите функции-члены блокировки и разблокировки.
Внимание
После создания CSemaphore
объекта используйте GetLastError , чтобы убедиться, что мьютекс еще не существовал. Если мьютекс существовал неожиданно, он может указать, что процесс изгоя скватируется и может намереваться использовать мьютекс злонамеренно. В этом случае рекомендуется закрыть дескриптор и продолжить, как если бы при создании объекта произошел сбой.