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’objetCCriticalSection
quand il est nécessaire. Après un retour réussi du constructeur, verrouillez explicitement l’objet avec un appel àLock
. AppelezUnlock
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 etUnlock
uneLock
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
CCriticalSection
membre 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
dwTimeout
Lock
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
.