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


Класс 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 объектов см. в статье "Многопоточность: использование классов синхронизации".

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

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.

Замечания

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

Важно!

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

См. также

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