Share via


CCriticalSection-klasse

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Vertegenwoordigt een 'kritieke sectie': een synchronisatieobject waarmee één thread tegelijk toegang heeft tot een resource of sectie met code.

Syntaxis

class CCriticalSection : public CSyncObject

Leden

Openbare constructors

Naam Description
CCriticalSection::CCriticalSection Maakt een CCriticalSection object.

Openbare methoden

Naam Description
CCriticalSection::Lock Gebruik dit om toegang te krijgen tot het CCriticalSection object.
CCriticalSection::Unlock Hiermee wordt het CCriticalSection object vrijgegeven.

Openbare operators

Naam Description
CCriticalSection::operator CRITICAL_SECTION* Hiermee wordt een aanwijzer naar het interne CRITICAL_SECTION object opgehaald.

Leden van openbare gegevens

Naam Description
CCriticalSection::m_sect Een CRITICAL_SECTION-object.

Opmerkingen

Kritieke secties zijn handig wanneer slechts één thread tegelijk kan worden toegestaan om gegevens of een andere beheerde resource te wijzigen. Het toevoegen van knooppunten aan een gekoppelde lijst is bijvoorbeeld een proces dat slechts door één thread tegelijk mag worden toegestaan. Door een CCriticalSection object te gebruiken om de gekoppelde lijst te beheren, kan slechts één thread tegelijk toegang krijgen tot de lijst.

Opmerking

De functionaliteit van de CCriticalSection klasse wordt geleverd door een daadwerkelijk Win32-object CRITICAL_SECTION .

Kritieke secties worden gebruikt in plaats van mutexes (zie CMutex) wanneer de snelheid kritiek is en de resource niet wordt gebruikt voor procesgrenzen.

Er zijn twee methoden voor het gebruik van een CCriticalSection object: zelfstandig en ingesloten in een klasse.

  • Zelfstandige methode Als u een zelfstandig CCriticalSection object wilt gebruiken, maakt u het CCriticalSection object wanneer dit nodig is. Na een geslaagde terugkeer van de constructor, vergrendelt u het object expliciet met een aanroep naar Lock. Aanroepen Unlock wanneer u klaar bent met het openen van de kritieke sectie. Deze methode, terwijl het duidelijker is voor iemand die uw broncode leest, is gevoeliger voor fouten, omdat u moet onthouden om de kritieke sectie voor en na toegang te vergrendelen en te ontgrendelen.

    Een betere methode is het gebruik van de CSingleLock klasse. Het heeft ook een Lock en Unlock methode, maar u hoeft zich geen zorgen te maken over het ontgrendelen van de resource als er een uitzondering optreedt.

  • Ingesloten methode U kunt een klasse ook delen met meerdere threads door een CCriticalSection-type gegevenslid toe te voegen aan de klasse en het gegevenslid te vergrendelen wanneer dat nodig is.

Zie het artikel Multithreading: De synchronisatieklassen gebruiken voor meer informatie over het gebruik CCriticalSection van objecten.

Overnamehiërarchie

CObject

CSyncObject

CCriticalSection

Requirements

Rubriek:afxmt.h

CCriticalSection::CCriticalSection

Maakt een CCriticalSection object.

CCriticalSection();

Opmerkingen

Als u een CCriticalSection object wilt openen of vrijgeven, maakt u een CSingleLock object en roept u de Lock functies en Unlock leden aan. Als het object zelfstandig wordt gebruikt, roept u de CCriticalSectionUnlock lidfunctie aan om het los te laten.

Als de constructor het vereiste systeemgeheugen niet toewijst, wordt automatisch een geheugen-uitzondering (van het type CMemoryException) gegenereerd.

Example

Zie het voorbeeld voor CCriticalSection::Lock.

CCriticalSection::Lock

Roep deze lidfunctie aan om toegang te krijgen tot het kritieke sectieobject.

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

Parameterwaarden

dwTimeout Lock negeert deze parameterwaarde.

Retourwaarde

Niet-nul als de functie is geslaagd; anders 0.

Opmerkingen

Lock is een blokkerende aanroep die pas wordt geretourneerd als het kritieke sectieobject wordt gesignaleerd (wordt beschikbaar).

Als getimede wachttijden nodig zijn, kunt u een CMutex object gebruiken in plaats van een CCriticalSection object.

Als Lock het benodigde systeemgeheugen niet kan worden toegewezen, wordt automatisch een geheugen-uitzondering (van het type CMemoryException) gegenereerd.

Example

In dit voorbeeld wordt de geneste kritieke sectiebenadering gedemonstreerd door de toegang tot een gedeelde resource (het statische _strShared object) te beheren met behulp van een gedeeld CCriticalSection object. De SomeMethod functie laat zien hoe u een gedeelde resource op een veilige manier bijwerkt.

//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

Bevat een kritiek sectieobject dat door alle CCriticalSection methoden wordt gebruikt.

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

Hiermee haalt u een CRITICAL_SECTION object op.

operator CRITICAL_SECTION*();

Opmerkingen

Roep deze functie aan om een aanwijzer op te halen naar het interne CRITICAL_SECTION object.

CCriticalSection::Unlock

Hiermee wordt het CCriticalSection object vrijgegeven voor gebruik door een andere thread.

BOOL Unlock();

Retourwaarde

Niet-nul als het CCriticalSection object eigendom was van de thread en de release is geslaagd; anders 0.

Opmerkingen

Als de CCriticalSection functie zelfstandig wordt gebruikt, moet u direct na het voltooien van het gebruik van de resource die wordt beheerd door de kritieke sectie, Unlock worden aangeroepen. Als een CSingleLock object wordt gebruikt, CCriticalSection::Unlock wordt deze aangeroepen door de lidfunctie van Unlock het vergrendelingsobject.

Example

Zie het voorbeeld voor CCriticalSection::Lock.

Zie ook

CSyncObject klasse
Hiërarchiegrafiek
CMutex klasse