Share via


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

CObject

CSyncObject

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.

Voir aussi

CSyncObject, classe
Graphique hiérarchique