Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Un objet de classe CSemaphore représente un « sémaphore ». Un sémaphore est un objet de synchronisation qui contrôle l’accès aux ressources partagées et empêche les conditions de concurrence.
Syntaxe
class CSemaphore : public CSyncObject
Membres
Constructeurs publics
| Nom | Descriptif |
|---|---|
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’autres utilisateurs 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 est 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 est 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 ou CMultiLock un CSingleLock objet et appelez ses Lock fonctions membres et Déverrouillage.
Important
Après avoir créé l’objet CSemaphore , utilisez cette option GetLastError pour vous assurer que le mutex n’existe 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.