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
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.