Поделиться через


Класс CSemaphore

Объект класса CSemaphore представляет собой "семафор". Семафор — это объект синхронизации, который управляет доступом к общим ресурсам и предотвращает условия гонки.

Синтаксис

class CSemaphore : public CSyncObject

Участники

Открытые конструкторы

Имя Описание
CSemaphore::CSemaphore Формирует объект CSemaphore.

Замечания

Семафоры полезны при управлении доступом к общему ресурсу, который может поддерживать только ограниченное количество пользователей. Текущее число CSemaphore объектов — это число разрешенных других пользователей. Когда число достигает нуля, все попытки использовать ресурс, контролируемый CSemaphore объектом, вставляются в системную очередь и подождите, пока не истекает время ожидания, или число увеличивается выше 0. Максимальное количество пользователей, которые могут получить доступ к управляемому ресурсу за один раз, указывается во время строительства CSemaphore объекта.

Чтобы использовать CSemaphore объект, создайте CSemaphore объект при необходимости. Укажите имя семафора, на которое вы хотите ждать, и что ваше приложение должно изначально владеть им. Затем вы можете получить доступ к семафору при возврате конструктора. Вызовите CSyncObject::Unlock , когда вы закончите доступ к управляемому ресурсу.

Альтернативным способом использования CSemaphore объектов является добавление переменной типа CSemaphore в качестве элемента данных в класс, который вы хотите контролировать. Во время построения управляемого объекта вызовите конструктор CSemaphore элемента данных, указав начальное число доступа, максимальное число доступа, имя семафора (если оно используется через границы процесса) и требуемые атрибуты безопасности.

Чтобы получить доступ к ресурсам, контролируемым CSemaphore объектами таким образом, сначала создайте переменную типа CSingleLock или тип CMultiLock в функции-члене ресурса. Затем вызовите функцию-член объекта Lock блокировки (например, CSingleLock::Lock). На этом этапе поток получит доступ к ресурсу, подождите, пока ресурс будет освобожден и получите доступ, или дождитесь освобождения ресурса и истечения времени ожидания, не получая доступа к ресурсу. В любом случае доступ к ресурсу осуществляется в потокобезопасном режиме. Чтобы освободить ресурс, используйте функцию-член объекта Unlock блокировки (например, CSingleLock::Unlock) или разрешите объекту блокировки выйти из области.

Кроме того, можно создать автономный CSemaphore объект и получить к нему явный доступ, прежде чем пытаться получить доступ к управляемому ресурсу. Этот метод, хотя и более понятный для того, кто читает исходный код, более подвержен ошибке.

Дополнительные сведения об использовании CSemaphore объектов см. в статье "Многопоточность: использование классов синхронизации".

Иерархия наследования

CObject

CSyncObject

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.

Замечания

Чтобы получить доступ к объекту CSemaphoreCMultiLock или освободить его, создайте объект CSingleLock и вызовите функции-члены и Lock его.

Внимание

После создания CSemaphore объекта используйте для GetLastError обеспечения того, чтобы мьютекс еще не существовал. Если мьютекс существовал неожиданно, он может указать, что процесс изгоя скватируется и может намереваться использовать мьютекс злонамеренно. В этом случае рекомендуется закрыть дескриптор и продолжить, как если бы при создании объекта произошел сбой.

См. также

CSyncObject Класс
Диаграмма иерархии