CCriticalSection
Třída
Představuje "kritickou část" – synchronizační objekt, který umožňuje přístup k prostředku nebo oddílu kódu po jednom vlákně.
Syntaxe
class CCriticalSection : public CSyncObject
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CCriticalSection::CCriticalSection |
CCriticalSection Vytvoří objekt. |
Veřejné metody
Název | Popis |
---|---|
CCriticalSection::Lock |
Slouží k získání přístupu k objektu CCriticalSection . |
CCriticalSection::Unlock |
CCriticalSection Uvolní objekt. |
Veřejné operátory
Název | Popis |
---|---|
CCriticalSection::operator CRITICAL_SECTION* |
Načte ukazatel na interní CRITICAL_SECTION objekt. |
Veřejné datové členy
Název | Popis |
---|---|
CCriticalSection::m_sect |
Objekt CRITICAL_SECTION . |
Poznámky
Kritické oddíly jsou užitečné, pokud je možné povolit úpravu dat nebo některého jiného řízeného prostředku jenom jedno vlákno najednou. Například přidání uzlů do propojeného seznamu je proces, který by měl být povolen pouze jedním vláknem najednou. Pomocí objektu CCriticalSection
pro řízení propojeného seznamu může přístup k seznamu získat pouze jedno vlákno najednou.
Poznámka:
Funkce CCriticalSection
třídy je poskytována skutečným objektem Win32 CRITICAL_SECTION
.
Kritické části se používají místo mutexů (viz CMutex
) v případech, kdy je rychlost kritická a prostředek se nebude používat přes hranice procesu.
Existují dvě metody použití objektu CCriticalSection
: samostatné a vložené do třídy.
Samostatná metoda Chcete-li použít samostatný
CCriticalSection
objekt, vytvořteCCriticalSection
objekt, pokud je potřeba. Po úspěšném návratu z konstruktoru explicitně uzamkněte objekt volánímLock
. VoláníUnlock
po dokončení přístupu k důležité části Tato metoda, zatímco jasnější pro někoho, kdo čte váš zdrojový kód, je náchylnější k chybě, protože musíte pamatovat na uzamčení a odemknutí kritické části před a po přístupu.Vhodnější metodou je použít
CSingleLock
třídu. Má také aUnlock
metoduLock
, ale nemusíte se starat o odemknutí prostředku, pokud dojde k výjimce.Vložená metoda Můžete také sdílet třídu s více vlákny přidáním datového členu
CCriticalSection
-type do třídy a uzamčením datového členu v případě potřeby.
Další informace o používání CCriticalSection
objektů naleznete v článku Multithreading: Jak používat synchronizační třídy.
Hierarchie dědičnosti
CCriticalSection
Požadavky
Záhlaví: afxmt.h
CCriticalSection::CCriticalSection
CCriticalSection
Vytvoří objekt.
CCriticalSection();
Poznámky
Pokud chcete získat přístup k objektu nebo ho CCriticalSection
uvolnit, vytvořte objekt a volejte jeho Lock
a Unlock
členské CSingleLock
funkce. CCriticalSection
Pokud se objekt používá samostatně, zavolejte jeho členovou Unlock
funkci a uvolněte ho.
Pokud se konstruktoru nepodaří přidělit požadovanou systémovou paměť, vyvolá se automaticky výjimka paměti (typu CMemoryException
).
Příklad
Podívejte se na příklad pro CCriticalSection::Lock.
CCriticalSection::Lock
Voláním této členské funkce získáte přístup k objektu kritického oddílu.
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
Parametry
dwTimeout
Lock
ignoruje tuto hodnotu parametru.
Návratová hodnota
Nenulové, pokud byla funkce úspěšná; jinak 0.
Poznámky
Lock
je blokující volání, které se nevrátí, dokud nebude objekt kritického oddílu signalován (bude k dispozici).
Pokud jsou potřeba časově čekání, můžete místo objektu CCriticalSection
použít CMutex
objekt.
Pokud Lock
se nepodaří přidělit potřebnou systémovou paměť, automaticky se vyvolá výjimka paměti (typu CMemoryException
).
Příklad
Tento příklad ukazuje přístup vnořené kritické části řízením přístupu ke sdílenému prostředku (statickému _strShared
objektu) pomocí sdíleného CCriticalSection
objektu. Funkce SomeMethod
demonstruje bezpečnou aktualizaci sdíleného prostředku.
//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
Obsahuje objekt kritického oddílu, který se používá všemi CCriticalSection
metodami.
CRITICAL_SECTION m_sect;
CCriticalSection::operator CRITICAL_SECTION*
Načte CRITICAL_SECTION
objekt.
operator CRITICAL_SECTION*();
Poznámky
Voláním této funkce načtete ukazatel na interní CRITICAL_SECTION
objekt.
CCriticalSection::Unlock
CCriticalSection
Uvolní objekt pro použití jiným vláknem.
BOOL Unlock();
Návratová hodnota
Nenulové, pokud CCriticalSection
objekt vlastní vlákno a vydání bylo úspěšné; jinak 0.
Poznámky
CCriticalSection
Pokud se používá samostatně, Unlock
musí být volána okamžitě po dokončení používání prostředku řízeného kritickým oddílem. CSingleLock
Pokud se objekt používá, CCriticalSection::Unlock
bude volána členskou Unlock
funkcí objektu zámku.
Příklad
Podívejte se na příklad pro CCriticalSection::Lock
.