CSemaphore, classe
Un objet de classe CSemaphore
représente un « sémaphore » : objet de synchronisation qui permet à un nombre limité de threads dans un ou plusieurs processus d’accéder à un nombre de threads qui accèdent actuellement à une ressource spécifiée.
Syntaxe
class CSemaphore : public CSyncObject
Membres
Constructeurs publics
Nom | Description |
---|---|
CSemaphore ::CSemaphore | Construit un objet CSemaphore . |
Notes
Les sémaphores sont utiles pour contrôler l’accès à une ressource partagée qui ne peut prendre en charge qu’un nombre limité d’utilisateurs. Le nombre actuel de l’objet CSemaphore
est le nombre d’utilisateurs supplémentaires autorisés. Lorsque le nombre atteint zéro, toutes les tentatives d’utilisation de la ressource contrôlée par l’objet CSemaphore
sont insérées dans une file d’attente système et attendent qu’elles expirent ou que le nombre augmente au-dessus de 0. Le nombre maximal d’utilisateurs qui peuvent accéder à la ressource contrôlée à la fois est spécifié lors de la construction de l’objet CSemaphore
.
Pour utiliser un CSemaphore
objet, construisez l’objet CSemaphore
quand il est nécessaire. Spécifiez le nom du sémaphore sur lequel vous souhaitez attendre et que votre application doit la posséder initialement. Vous pouvez ensuite accéder au sémaphore lorsque le constructeur retourne. Appelez CSyncObject ::Unlock lorsque vous avez terminé d’accéder à la ressource contrôlée.
Une autre méthode d’utilisation CSemaphore
d’objets consiste à ajouter une variable de type CSemaphore
en tant que membre de données à la classe que vous souhaitez contrôler. Lors de la construction de l’objet contrôlé, appelez le constructeur du CSemaphore
membre de données en spécifiant le nombre d’accès initial, le nombre maximal d’accès, le nom du sémaphore (s’il sera utilisé entre les limites du processus) et les attributs de sécurité souhaités.
Pour accéder aux ressources contrôlées par CSemaphore
les objets de cette façon, créez d’abord une variable de type CSingleLock ou de type CMultiLock dans la fonction membre d’accès de votre ressource. Appelez ensuite la fonction membre de l’objet Lock
lock (par exemple, CSingleLock ::Lock). À ce stade, votre thread accède à la ressource, attend la publication et l’accès à la ressource, ou attend que la ressource soit libérée et expire, et ne parvient pas à accéder à la ressource. Dans tous les cas, votre ressource a été accessible de manière thread-safe. Pour libérer la ressource, utilisez la fonction membre de l’objet Unlock
lock (par exemple, CSingleLock ::Unlock) ou autorisez l’objet de verrouillage à sortir de l’étendue.
Vous pouvez également créer un CSemaphore
objet autonome et y accéder explicitement avant de tenter d’accéder à la ressource contrôlée. Cette méthode, bien qu’elle soit plus claire pour quelqu’un qui lit votre code source, est plus sujette à une erreur.
Pour plus d’informations sur l’utilisation des CSemaphore
objets, consultez l’article Multithreading : Utilisation des classes de synchronisation.
Hiérarchie d'héritage
CSemaphore
Spécifications
En-tête : afxmt.h
CSemaphore ::CSemaphore
Construit un objet nommé ou non nommé CSemaphore
.
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
Paramètres
lInitialCount
Nombre initial d’utilisation pour le sémaphore. Doit être supérieur ou égal à 0, et inférieur ou égal à lMaxCount.
lMaxCount
Nombre maximal d’utilisations pour le sémaphore. Doit être supérieure à 0.
pstrName
Nom du sémaphore. Doit être fourni si le sémaphore est accessible à travers les limites du processus. Si NULL
, l’objet n’est pas nommé. Si le nom correspond à un sémaphore existant, le constructeur génère un nouvel CSemaphore
objet qui fait référence au sémaphore de ce nom. Si le nom correspond à un objet de synchronisation existant qui n’est pas un sémaphore, la construction échoue.
lpsaAttributes
Attributs de sécurité pour l’objet sémaphore. Pour obtenir une description complète de cette structure, consultez SECURITY_ATTRIBUTES dans le Kit de développement logiciel (SDK) Windows.
Notes
Pour accéder ou libérer un CSemaphore
objet, créez un objet CMultiLock ou CSingleLock et appelez ses fonctions de membre Lock et Unlock.
Important
Après avoir créé l’objet CSemaphore
, utilisez GetLastError pour vous assurer que le mutex n’existait pas déjà. Si le mutex existait de façon inattendue, il peut indiquer qu’un processus non autorisé est en squattage et qu’il est susceptible d’utiliser le mutex malveillantment. Dans ce cas, la procédure recommandée pour la sécurité consiste à fermer le handle et à continuer comme s’il y avait un échec dans la création de l’objet.