Sdílet prostřednictvím


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řte CCriticalSection objekt, pokud je potřeba. Po úspěšném návratu z konstruktoru explicitně uzamkněte objekt voláním Lock. 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é a Unlock 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

CObject

CSyncObject

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.

Viz také

CSyncObject Třída
Graf hierarchie
CMutex Třída