Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ý
CCriticalSectionobjekt, vytvořteCCriticalSectionobjekt, pokud je potřeba. Po úspěšném návratu z konstruktoru explicitně uzamkněte objekt volánímLock. VoláníUnlockpo 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
CSingleLocktřídu. Má také aUnlockmetoduLock, 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
dwTimeoutLock 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.