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.
La classe
Représente une « section critique » : objet de synchronisation qui permet à un thread à la fois d’accéder à une ressource ou à une section de code.
Syntaxe
class CCriticalSection : public CSyncObject
Membres
Constructeurs publics
| Nom | Description |
|---|---|
CCriticalSection::CCriticalSection |
Construit un objet CCriticalSection. |
Méthodes publiques
| Nom | Description |
|---|---|
CCriticalSection::Lock |
Permet d’accéder à l’objet CCriticalSection . |
CCriticalSection::Unlock |
Libère l'objet CCriticalSection. |
Opérateurs publics
| Nom | Description |
|---|---|
CCriticalSection::operator CRITICAL_SECTION* |
Récupère un pointeur vers l’objet interne CRITICAL_SECTION . |
Membres de données publics
| Nom | Description |
|---|---|
CCriticalSection::m_sect |
Objet CRITICAL_SECTION. |
Notes
Les sections critiques sont utiles quand un seul thread à la fois peut être autorisé à modifier des données ou une autre ressource contrôlée. Par exemple, l’ajout de nœuds à une liste liée est un processus qui ne doit être autorisé que par un thread à la fois. En utilisant un CCriticalSection objet pour contrôler la liste liée, un seul thread à la fois peut accéder à la liste.
Remarque
La fonctionnalité de la CCriticalSection classe est fournie par un objet Win32 CRITICAL_SECTION réel.
Les sections critiques sont utilisées au lieu de mutex (voir CMutex) lorsque la vitesse est critique et que la ressource ne sera pas utilisée au-delà des limites de processus.
Il existe deux méthodes d’utilisation d’un CCriticalSection objet : autonome et incorporé dans une classe.
Méthode autonome Pour utiliser un objet autonome
CCriticalSection, construisez l’objetCCriticalSectionquand il est nécessaire. Après un retour réussi du constructeur, verrouillez explicitement l’objet avec un appel àLock. AppelezUnlocklorsque vous avez terminé d’accéder à la section critique. Cette méthode, bien que plus claire pour une personne qui lit votre code source, est plus sujette à une erreur, car vous devez vous rappeler de verrouiller et déverrouiller la section critique avant et après l’accès.Une méthode plus préférable consiste à utiliser la
CSingleLockclasse. Il a également une méthode etUnlockuneLockméthode, mais vous n’avez pas à vous soucier du déverrouillage de la ressource si une exception se produit.Méthode incorporée Vous pouvez également partager une classe avec plusieurs threads en ajoutant un
CCriticalSectionmembre de données -type à la classe et en verrouillant le membre de données si nécessaire.
Pour plus d’informations sur l’utilisation d’objets CCriticalSection , consultez l’article Multithreading : Utilisation des classes de synchronisation.
Hiérarchie d'héritage
CCriticalSection
Spécifications
En-tête : afxmt.h
CCriticalSection::CCriticalSection
Construit un objet CCriticalSection.
CCriticalSection();
Notes
Pour accéder ou libérer un CCriticalSection objet, créez un CSingleLock objet et appelez ses Lock fonctions membres.Unlock Si l’objet CCriticalSection est utilisé autonome, appelez sa Unlock fonction membre pour la libérer.
Si le constructeur ne parvient pas à allouer la mémoire système requise, une exception de mémoire (de type CMemoryException) est levée automatiquement.
Exemple
Consultez l’exemple de CCriticalSection ::Lock.
CCriticalSection::Lock
Appelez cette fonction membre pour accéder à l’objet de section critique.
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
Paramètres
dwTimeoutLock ignore cette valeur de paramètre.
Valeur de retour
Différent de zéro si la fonction a réussi ; sinon 0.
Notes
Lock est un appel bloquant qui ne retourne pas tant que l’objet de section critique n’est pas signalé (devient disponible).
Si des attentes chronométrées sont nécessaires, vous pouvez utiliser un CMutex objet au lieu d’un CCriticalSection objet.
En Lock cas d’échec de l’allocation de la mémoire système nécessaire, une exception de mémoire (de type CMemoryException) est levée automatiquement.
Exemple
Cet exemple illustre l’approche de section critique imbriquée en contrôlant l’accès à une ressource partagée (l’objet statique _strShared ) à l’aide d’un objet partagé CCriticalSection . La SomeMethod fonction illustre la mise à jour d’une ressource partagée de manière sécurisée.
//Definition of critical section class
class CMyCritSectClass
{
static CString _strShared; //shared resource
static CCriticalSection _critSect;
public:
CMyCritSectClass(void) {}
~CMyCritSectClass(void) {}
void SomeMethod(void); //locks, modifies, and unlocks shared resource
};
//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;
void CMyCritSectClass::SomeMethod()
{
_critSect.Lock();
if (_strShared == "")
_strShared = "<text>";
_critSect.Unlock();
}
CCriticalSection::m_sect
Contient un objet de section critique utilisé par toutes les CCriticalSection méthodes.
CRITICAL_SECTION m_sect;
CCriticalSection::operator CRITICAL_SECTION*
Récupère un CRITICAL_SECTION objet.
operator CRITICAL_SECTION*();
Notes
Appelez cette fonction pour récupérer un pointeur vers l’objet interne CRITICAL_SECTION .
CCriticalSection::Unlock
Libère l’objet CCriticalSection à utiliser par un autre thread.
BOOL Unlock();
Valeur de retour
Différent de zéro si l’objet CCriticalSection était détenu par le thread et que la version a réussi ; sinon, 0.
Notes
Si la CCriticalSection ressource est utilisée autonome, Unlock elle doit être appelée immédiatement après l’utilisation de la ressource contrôlée par la section critique. Si un CSingleLock objet est utilisé, CCriticalSection::Unlock est appelé par la fonction membre de l’objet Unlock de verrouillage.
Exemple
Consultez l’exemple pour CCriticalSection::Lock.