Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
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
CCriticalSectionobject wilt gebruiken, maakt u hetCCriticalSectionobject wanneer dit nodig is. Na een geslaagde terugkeer van de constructor, vergrendelt u het object expliciet met een aanroep naarLock. AanroepenUnlockwanneer 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
CSingleLockklasse. Het heeft ook eenLockenUnlockmethode, 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
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.