Compartir a través de


Clase CSemaphore

Un objeto de clase CSemaphore representa un "semáforo", que es un objeto de sincronización que permite que un número limitado de subprocesos de uno o varios procesos accedan a mantener un recuento del número de subprocesos a los que accede actualmente un recurso especificado.

Sintaxis

class CSemaphore : public CSyncObject

Miembros

Constructores públicos

Nombre Descripción
CSemaphore::CSemaphore Construye un objeto CSemaphore.

Comentarios

Los semáforos son útiles para controlar el acceso a un recurso compartido que solo puede admitir un número limitado de usuarios. El recuento actual del objeto CSemaphore es el número de usuarios adicionales permitidos. Cuando el recuento alcanza cero, todos los intentos de usar el recurso que controla el objeto CSemaphore se insertarán en una cola del sistema y esperarán hasta que se cumpla el tiempo de espera o el recuento aumente por encima de 0. El número máximo de usuarios que pueden acceder a la vez al recurso controlado se especifica durante la construcción del objeto CSemaphore.

Para usar un objeto CSemaphore, construya el objeto CSemaphore cuando sea necesario. Especifique el nombre del semáforo en el que quiere esperar y que la aplicación debe poseer inicialmente. Después, puede acceder al semáforo cuando el constructor devuelva un resultado. Llamada a CSyncObject::Unlock cuando haya terminado de acceder al recurso controlado.

Un método alternativo para usar objetos CSemaphore es agregar una variable de tipo CSemaphore como miembro de datos a la clase que desea controlar. Durante la construcción del objeto controlado, llame al constructor del miembro de datos CSemaphore especificando el recuento de acceso inicial, el recuento de acceso máximo, el nombre del semáforo (si se usará en los límites del proceso) y los atributos de seguridad deseados.

Para acceder a los recursos controlados por CSemaphore objetos de esta manera, primero cree una variable de tipo CSingleLock o escriba CMultiLock en la función miembro de acceso del recurso. A continuación, llame a la función miembro del Lock objeto de bloqueo (por ejemplo, CSingleLock::Lock). En este momento, el subproceso obtendrá acceso al recurso, esperará a que el recurso se libere y obtenga acceso, o esperará a que se libere el recurso y se agote el tiempo de espera, sin obtener acceso al recurso. En cualquier caso, se ha accedido al recurso de forma segura para subproceso. Para liberar el recurso, use la función miembro del Unlock objeto de bloqueo (por ejemplo, CSingleLock::Unlock), o permita que el objeto de bloqueo quede fuera del ámbito.

Como alternativa, puede crear un objeto CSemaphore independiente y acceder a él de forma explícita antes de intentar acceder al recurso controlado. Este método, aunque resulta más claro para alguien que lee el código fuente, es más propenso a errores.

Para obtener más información sobre cómo usar los objetos CSemaphore, vea el artículo Multithreading: Procedimientos para usar las clases de sincronización.

Jerarquía de herencia

CObject

CSyncObject

CSemaphore

Requisitos

Encabezado: afxmt.h

CSemaphore::CSemaphore

Construye un objeto CSemaphore con o sin nombre.

CSemaphore(
    LONG lInitialCount = 1,
    LONG lMaxCount = 1,
    LPCTSTR pstrName = NULL,
    LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);

Parámetros

lInitialCount
Recuento de uso inicial del semáforo. Debe ser mayor o igual que 0, y menor o igual que lMaxCount.

lMaxCount
Recuento de uso máximo del semáforo. Debe ser mayor que 0.

pstrName
Nombre del semáforo. Se debe proporcionar si se va a acceder al semáforo en los límites del proceso. Si es NULL, el objeto no tendrá nombre. Si el nombre coincide con un semáforo existente, el constructor compila un objeto CSemaphore nuevo que hace referencia al semáforo de ese nombre. Si el nombre coincide con un objeto de sincronización existente que no es un semáforo, se producirá un error en la construcción.

lpsaAttributes
Atributos de seguridad para el objeto de semáforo. Para obtener una descripción completa de esta estructura, vea SECURITY_ATTRIBUTES en Windows SDK.

Comentarios

Para acceder o liberar un CSemaphore objeto, cree un objeto CMultiLock o CSingleLock y llame a sus funciones de miembro Bloquear y Desbloquear.

Importante

Después de crear el CSemaphore objeto, use GetLastError para asegurarse de que la exclusión mutua aún no existía. Si la exclusión mutua existía inesperadamente, puede indicar que un proceso no autorizado está en ocupación y puede estar intentando usar la exclusión mutua de forma malintencionada. En este caso, el procedimiento recomendado para la seguridad es cerrar el identificador y continuar como si hubiera un error al crear el objeto.

Consulte también

CSyncObject (clase)
Gráfico de jerarquías