Partager via


CreateSemaphoreExW, fonction (synchapi.h)

Crée ou ouvre un objet sémaphore nommé ou sans nom et retourne un handle à l’objet.

Syntaxe

HANDLE CreateSemaphoreExW(
  [in, optional] LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
  [in]           LONG                  lInitialCount,
  [in]           LONG                  lMaximumCount,
  [in, optional] LPCWSTR               lpName,
                 DWORD                 dwFlags,
  [in]           DWORD                 dwDesiredAccess
);

Paramètres

[in, optional] lpSemaphoreAttributes

Pointeur vers une structure SECURITY_ATTRIBUTES. Si ce paramètre est null, le handle de sémaphore ne peut pas être hérité par les processus enfants.

Le lpSecurityDescriptor membre de la structure spécifie un descripteur de sécurité pour le nouveau sémaphore. Si ce paramètre est NULL, le sémaphore obtient un descripteur de sécurité par défaut. Les listes de contrôle d’accès dans le descripteur de sécurité par défaut pour un sémaphore proviennent du jeton principal ou d’emprunt d’identité du créateur.

[in] lInitialCount

Nombre initial de l’objet sémaphore. Cette valeur doit être supérieure ou égale à zéro et inférieure ou égale à lMaximumCount. L’état d’un sémaphore est signalé lorsque son nombre est supérieur à zéro et non signé lorsqu’il est égal à zéro. Le nombre est diminué d’une fois qu’une fonction d’attente libère un thread qui attendait le sémaphore. Le nombre est augmenté d’une quantité spécifiée en appelant la fonction ReleaseSemaphore.

[in] lMaximumCount

Nombre maximal pour l’objet sémaphore. Cette valeur doit être supérieure à zéro.

[in, optional] lpName

Pointeur vers une chaîne terminée par null spécifiant le nom de l’objet sémaphore. Le nom est limité à MAX_PATH caractères. La comparaison de noms respecte la casse.

Si lpName correspond au nom d’un objet sémaphore nommé existant, les paramètres lInitialCount et lMaximumCount sont ignorés, car ils ont déjà été définis par le processus de création. Si le paramètre lpSemaphoreAttributes n’est pas NULL, il détermine si le handle peut être hérité.

Si lpName est NULL, l’objet sémaphore est créé sans nom.

Si lpName correspond au nom d’un événement existant, mutex, minuteur d’attente, travail ou objet de mappage de fichiers, la fonction échoue et la fonction GetLastError retourne ERROR_INVALID_HANDLE. Cela se produit parce que ces objets partagent le même espace de noms.

Le nom peut avoir un préfixe « Global » ou « Local » pour créer explicitement l’objet dans l’espace de noms global ou de session. Le reste du nom peut contenir n’importe quel caractère, à l’exception du caractère de barre oblique inverse (\). Pour plus d’informations, consultez espaces de noms d’objets noyau. Le basculement rapide des utilisateurs est implémenté à l’aide de sessions Terminal Services. Les noms d’objets noyau doivent suivre les instructions décrites pour les services Terminal Services afin que les applications puissent prendre en charge plusieurs utilisateurs.

L’objet peut être créé dans un espace de noms privé. Pour plus d’informations, consultez espaces de noms d’objets.

dwFlags

Ce paramètre est réservé et doit être 0.

[in] dwDesiredAccess

Masque d’accès pour l’objet sémaphore. Pour obtenir la liste des droits d’accès, consultez synchronisation des droits d’accès et sécurité des objets.

Valeur de retour

Si la fonction réussit, la valeur de retour est un handle de l’objet sémaphore. Si l’objet sémaphore nommé existait avant l’appel de fonction, la fonction retourne un handle à l’objet existant et GetLastError retourne ERROR_ALREADY_EXISTS.

Si la fonction échoue, la valeur de retour est NULL . Pour obtenir des informations d’erreur étendues, appelez GetLastError.

Remarques

L’état d’un objet sémaphore est signalé lorsque son nombre est supérieur à zéro et non signé lorsque son nombre est égal à zéro. Le paramètre lInitialCount spécifie le nombre initial. Le nombre ne peut jamais être inférieur à zéro ou supérieur à la valeur spécifiée dans le paramètre lMaximumCount.

Tout thread du processus appelant peut spécifier le handle sémaphore-objet dans un appel à l’une des fonctions d’attente . Les fonctions d’attente à objet unique retournent lorsque l’état de l’objet spécifié est signalé. Les fonctions d’attente à plusieurs objets peuvent être indiquées pour retourner quand un ou lorsque tous les objets spécifiés sont signalés. Lorsqu’une fonction d’attente retourne, le thread en attente est libéré pour poursuivre son exécution. Chaque fois qu’un thread termine une attente pour un objet sémaphore, le nombre d’objets sémaphores est décrémenté par un. Une fois le thread terminé, il appelle la fonction ReleaseSemaphore, qui incrémente le nombre de l’objet sémaphore.

Plusieurs processus peuvent avoir des handles du même objet sémaphore, ce qui permet d’utiliser l’objet pour la synchronisation entre processus. Les mécanismes de partage d’objets suivants sont disponibles :

  • Un processus enfant créé par la fonction CreateProcess peut hériter d’un handle à un objet sémaphore si l’héritage lpSemaphoreAttributes de CreateSemaphoreEx l’héritage activé.
  • Un processus peut spécifier le handle sémaphore-objet dans un appel à la fonction DuplicateHandle pour créer un handle en double qui peut être utilisé par un autre processus.
  • Un processus peut spécifier le nom d’un objet sémaphore dans un appel à la fonction OpenSemaphore ou CreateSemaphoreEx.
Utilisez la fonction CloseHandle pour fermer le handle. Le système ferme automatiquement le handle lorsque le processus se termine. L’objet sémaphore est détruit lorsque sa dernière poignée a été fermée.

Exigences

Exigence Valeur
client minimum pris en charge Windows Vista [applications de bureau | Applications UWP]
serveur minimum pris en charge Windows Server 2008 [applications de bureau | Applications UWP]
plateforme cible Windows
d’en-tête synchapi.h (include Windows.h)
bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

closeHandle

objets sémaphores

fonctions de synchronisation