Partager via


La classe CCriticalSection

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’objet CCriticalSection quand il est nécessaire. Après un retour réussi du constructeur, verrouillez explicitement l’objet avec un appel à Lock. Appelez Unlock lorsque 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 CSingleLock classe. Il a également une méthode et Unlock une Lock mé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

CObject

CSyncObject

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.

Voir aussi

CSyncObject Classe
Graphique hiérarchique
CMutex Classe