Funzione CreateSemaphoreExW (synchapi.h)
Crea o apre un oggetto semaforo denominato o senza nome e restituisce un handle all'oggetto .
Sintassi
HANDLE CreateSemaphoreExW(
[in, optional] LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
[in] LONG lInitialCount,
[in] LONG lMaximumCount,
[in, optional] LPCWSTR lpName,
DWORD dwFlags,
[in] DWORD dwDesiredAccess
);
Parametri
[in, optional] lpSemaphoreAttributes
Puntatore a una struttura SECURITY_ATTRIBUTES. Se questo parametro è NULL, l'handle semaforo non può essere ereditato dai processi figlio.
Il lpSecurityDescriptor membro della struttura specifica un descrittore di sicurezza per il nuovo semaforo. Se questo parametro è NULL, il semaforo ottiene un descrittore di sicurezza predefinito. Gli ACL nel descrittore di sicurezza predefinito per un semaforo provengono dal token primario o di rappresentazione dell'autore.
[in] lInitialCount
Conteggio iniziale per l'oggetto semaforo. Questo valore deve essere maggiore o uguale a zero e minore o uguale a lMaximumCount. Lo stato di un semaforo viene segnalato quando il conteggio è maggiore di zero e non firmato quando è zero. Il conteggio viene ridotto di uno ogni volta che una funzione di attesa rilascia un thread in attesa del semaforo. Il conteggio viene aumentato di una quantità specificata chiamando la funzione ReleaseSemaphore.
[in] lMaximumCount
Numero massimo per l'oggetto semaforo. Questo valore deve essere maggiore di zero.
[in, optional] lpName
Puntatore a una stringa con terminazione Null che specifica il nome dell'oggetto semaforo. Il nome è limitato ai caratteri MAX_PATH. Il confronto tra nomi fa distinzione tra maiuscole e minuscole.
Se lpName corrisponde al nome di un oggetto semaforo denominato esistente, i parametri lInitialCount e lMaximumCount vengono ignorati perché sono già stati impostati dal processo di creazione. Se il parametro lpSemaphoreAttributes
Se lpName è NULL, l'oggetto semaforo viene creato senza un nome.
Se lpName corrisponde al nome di un evento esistente, mutex, timer in attesa, processo o mapping di file, la funzione ha esito negativo e la funzione GetLastError restituisce ERROR_INVALID_HANDLE. Ciò si verifica perché questi oggetti condividono lo stesso spazio dei nomi.
Il nome può avere un prefisso "Global" o "Local" per creare in modo esplicito l'oggetto nello spazio dei nomi globale o sessione. Il resto del nome può contenere qualsiasi carattere, ad eccezione del carattere barra rovesciata (\). Per altre informazioni, vedere spazi dei nomi dell'oggetto kernel . Il passaggio rapido dell'utente viene implementato usando le sessioni di Servizi terminal. I nomi degli oggetti del kernel devono seguire le linee guida descritte per Servizi terminal in modo che le applicazioni possano supportare più utenti.
L'oggetto può essere creato in uno spazio dei nomi privato. Per altre informazioni, vedere spazi dei nomi degli oggetti .
dwFlags
Questo parametro è riservato e deve essere 0.
[in] dwDesiredAccess
Maschera di accesso per l'oggetto semaforo. Per un elenco dei diritti di accesso, vedere Synchronization Object Security and Access Rights.
Valore restituito
Se la funzione ha esito positivo, il valore restituito è un handle per l'oggetto semaforo. Se l'oggetto semaforo denominato esiste prima della chiamata di funzione, la funzione restituisce un handle all'oggetto esistente e GetLastError restituisce ERROR_ALREADY_EXISTS.
Se la funzione ha esito negativo, il valore restituito è NULL. Per ottenere informazioni estese sull'errore, chiamare GetLastError.
Osservazioni
Lo stato di un oggetto semaforo viene segnalato quando il conteggio è maggiore di zero e non assegnato quando il conteggio è uguale a zero. Il parametro lInitialCount specifica il conteggio iniziale. Il conteggio non può mai essere minore di zero o maggiore del valore specificato nel parametro lMaximumCount.
Qualsiasi thread del processo chiamante può specificare l'handle dell'oggetto semaforo in una chiamata a una delle funzioni di attesa . Le funzioni di attesa a singolo oggetto restituiscono quando viene segnalato lo stato dell'oggetto specificato. È possibile indicare alle funzioni di attesa a più oggetti di restituire una o quando vengono segnalate tutte le funzioni di attesa per oggetti specificati. Quando viene restituita una funzione di attesa, il thread in attesa viene rilasciato per continuare l'esecuzione. Ogni volta che un thread completa un'attesa per un oggetto semaforo, il conteggio dell'oggetto semaforo viene decrementato di uno. Al termine del thread, chiama la funzione ReleaseSemaphore, che incrementa il conteggio dell'oggetto semaforo.
Più processi possono avere handle dello stesso oggetto semaforo, consentendo l'uso dell'oggetto per la sincronizzazione interprocesso. Sono disponibili i meccanismi di condivisione di oggetti seguenti:
- Un processo figlio creato dalla funzione CreateProcess
può ereditare un handle in un oggetto semaforo se l' lpSemaphoreAttributes parametro diCreateSemaphoreEx l'ereditarietà abilitata. - Un processo può specificare l'handle dell'oggetto semaforo in una chiamata alla funzione DuplicateHandle
per creare un handle duplicato che può essere usato da un altro processo. - Un processo può specificare il nome di un oggetto semaforo in una chiamata alla OpenSemaphore o funzione CreateSemaphoreEx.
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows Vista [app desktop | App UWP] |
server minimo supportato | Windows Server 2008 [app desktop | App UWP] |
piattaforma di destinazione | Finestre |
intestazione |
synchapi.h (include Windows.h) |
libreria |
Kernel32.lib |
dll | Kernel32.dll |