Función CreateSemaphoreExA (winbase.h)
Crea o abre un objeto de semáforo con nombre o sin nombre y devuelve un identificador al objeto .
Sintaxis
HANDLE CreateSemaphoreExA(
[in, optional] LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
[in] LONG lInitialCount,
[in] LONG lMaximumCount,
[in, optional] LPCSTR lpName,
DWORD dwFlags,
[in] DWORD dwDesiredAccess
);
Parámetros
[in, optional] lpSemaphoreAttributes
Puntero a una estructura de SECURITY_ATTRIBUTES . Si este parámetro es NULL, los procesos secundarios no pueden heredar el identificador del semáforo.
El miembro lpSecurityDescriptor de la estructura especifica un descriptor de seguridad para el nuevo semáforo. Si este parámetro es NULL, el semáforo obtiene un descriptor de seguridad predeterminado. Las ACL del descriptor de seguridad predeterminado para un semáforo proceden del token principal o de suplantación del creador.
[in] lInitialCount
Recuento inicial del objeto semáforo. Este valor debe ser mayor o igual que cero y menor o igual que lMaximumCount. El estado de un semáforo se señala cuando su recuento es mayor que cero y no se asigna cuando es cero. El recuento se reduce en uno cada vez que una función de espera libera un subproceso que estaba esperando el semáforo. El recuento se incrementa mediante una cantidad especificada llamando a la función ReleaseSemaphore .
[in] lMaximumCount
Recuento máximo del objeto semáforo. Este valor debe ser mayor que cero.
[in, optional] lpName
Puntero a una cadena terminada en null que especifica el nombre del objeto semáforo. El nombre está limitado a MAX_PATH caracteres. La comparación de nombres distingue mayúsculas de minúsculas.
Si lpName coincide con el nombre de un objeto semáforo con nombre existente, los parámetros lInitialCount y lMaximumCount se omiten porque ya se han establecido mediante el proceso de creación. Si el parámetro lpSemaphoreAttributes no es NULL, determina si el identificador se puede heredar.
Si lpName es NULL, el objeto semáforo se crea sin un nombre.
Si lpName coincide con el nombre de un evento existente, una exclusión mutua, un temporizador de espera, un trabajo o un objeto de asignación de archivos, se produce un error en la función y la función GetLastError devuelve ERROR_INVALID_HANDLE. Esto ocurre porque estos objetos comparten el mismo espacio de nombres.
El nombre puede tener un prefijo "Global" o "Local" para crear explícitamente el objeto en el espacio de nombres global o de sesión. El resto del nombre puede contener cualquier carácter excepto el carácter de barra diagonal inversa (\). Para obtener más información, vea Espacios de nombres de objeto kernel. El cambio rápido de usuario se implementa mediante sesiones de Terminal Services. Los nombres de objeto de kernel deben seguir las directrices descritas para Terminal Services para que las aplicaciones puedan admitir varios usuarios.
El objeto se puede crear en un espacio de nombres privado. Para obtener más información, vea Espacios de nombres de objeto.
dwFlags
Este parámetro está reservado y debe ser 0.
[in] dwDesiredAccess
Máscara de acceso para el objeto semáforo. Para obtener una lista de los derechos de acceso, consulte Synchronization Object Security and Access Rights(Derechos de acceso y seguridad de objetos de sincronización).
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es un identificador para el objeto semáforo. Si el objeto semáforo con nombre existía antes de la llamada a la función, la función devuelve un identificador al objeto existente y GetLastError devuelve ERROR_ALREADY_EXISTS.
Si la función no se realiza correctamente, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.
Comentarios
El estado de un objeto semáforo se señala cuando su recuento es mayor que cero y no se asigna cuando su recuento es igual a cero. El parámetro lInitialCount especifica el recuento inicial. El recuento nunca puede ser menor que cero o mayor que el valor especificado en el parámetro lMaximumCount .
Cualquier subproceso del proceso de llamada puede especificar el identificador del objeto semáforo en una llamada a una de las funciones de espera. Las funciones de espera de objeto único devuelven cuando se señala el estado del objeto especificado. Se pueden indicar a las funciones de espera de varios objetos que devuelvan cuando se señalizan cualquiera o cuando se señalizan todos los objetos especificados. Cuando se devuelve una función de espera, se libera el subproceso en espera para continuar su ejecución. Cada vez que un subproceso completa una espera para un objeto semáforo, el recuento del objeto semáforo se disminuye en uno. Cuando el subproceso ha finalizado, llama a la función ReleaseSemaphore , que incrementa el recuento del objeto semáforo.
Varios procesos pueden tener identificadores del mismo objeto semáforo, lo que permite el uso del objeto para la sincronización entre procesos. Los siguientes mecanismos de uso compartido de objetos están disponibles:
- Un proceso secundario creado por la función CreateProcess puede heredar un identificador a un objeto semáforo si el parámetro lpSemaphoreAttributes de la herencia habilitada para CreateSemaphoreEx .
- Un proceso puede especificar el identificador del objeto semáforo en una llamada a la función DuplicateHandle para crear un identificador duplicado que otro proceso pueda usar.
- Un proceso puede especificar el nombre de un objeto semáforo en una llamada a [OpenSemaphore](.. /synchapi/nf-synchapi-signalobjectandwait.md) o la función CreateSemaphoreEx .
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows Vista [aplicaciones de escritorio | aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2008 [aplicaciones de escritorio | aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | winbase.h (incluya Windows.h) |
Library | Kernel32.lib |
Archivo DLL | Kernel32.dll |