CCriticalSection
Klasa
Reprezentuje "sekcję krytyczną" — obiekt synchronizacji, który umożliwia jeden wątek naraz uzyskiwanie dostępu do zasobu lub sekcji kodu.
Składnia
class CCriticalSection : public CSyncObject
Elementy członkowskie
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
CCriticalSection::CCriticalSection |
CCriticalSection Tworzy obiekt. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
CCriticalSection::Lock |
Użyj polecenia , aby uzyskać dostęp do CCriticalSection obiektu. |
CCriticalSection::Unlock |
CCriticalSection Zwalnia obiekt. |
Operatory publiczne
Nazwa/nazwisko | opis |
---|---|
CCriticalSection::operator CRITICAL_SECTION* |
Pobiera wskaźnik do obiektu wewnętrznego CRITICAL_SECTION . |
Publiczne elementy członkowskie danych
Nazwa/nazwisko | opis |
---|---|
CCriticalSection::m_sect |
Obiekt CRITICAL_SECTION . |
Uwagi
Sekcje krytyczne są przydatne, gdy tylko jeden wątek jednocześnie może modyfikować dane lub inny kontrolowany zasób. Na przykład dodawanie węzłów do połączonej listy jest procesem, który powinien być dozwolony tylko przez jeden wątek naraz. Za pomocą obiektu do kontrolowania CCriticalSection
listy połączonej tylko jeden wątek jednocześnie może uzyskać dostęp do listy.
Uwaga
Funkcjonalność CCriticalSection
klasy jest dostarczana przez rzeczywisty obiekt Win32 CRITICAL_SECTION
.
Sekcje krytyczne są używane zamiast mutexes (zobacz CMutex
), gdy szybkość jest krytyczna, a zasób nie będzie używany przez granice procesów.
Istnieją dwie metody używania CCriticalSection
obiektu: autonomiczne i osadzone w klasie.
Autonomiczna metoda Aby użyć obiektu autonomicznego
CCriticalSection
, skonstruujCCriticalSection
obiekt, gdy jest potrzebny. Po pomyślnym powrocie z konstruktora jawnie zablokuj obiekt za pomocą wywołania metodyLock
. Wywołaj połączenieUnlock
po zakończeniu uzyskiwania dostępu do sekcji krytycznej. Ta metoda, choć jaśniejsza dla kogoś odczytującego kod źródłowy, jest bardziej podatna na błąd, ponieważ należy pamiętać, aby zablokować i odblokować sekcję krytyczną przed dostępem i po nim.Bardziej preferowaną metodą jest użycie
CSingleLock
klasy . Ma również metodęLock
iUnlock
, ale nie musisz martwić się o odblokowanie zasobu, jeśli wystąpi wyjątek.Metoda osadzona Można również udostępnić klasę wielu wątkom, dodając składową
CCriticalSection
danych typu -type do klasy i blokując składową danych w razie potrzeby.
Aby uzyskać więcej informacji na temat używania obiektów, zobacz artykuł Multithreading: How to Use the Synchronization Classes (Jak używać CCriticalSection
klas synchronizacji).
Hierarchia dziedziczenia
CCriticalSection
Wymagania
Nagłówek: afxmt.h
CCriticalSection::CCriticalSection
CCriticalSection
Tworzy obiekt.
CCriticalSection();
Uwagi
Aby uzyskać dostęp do obiektu lub zwolnić CCriticalSection
go, utwórz CSingleLock
obiekt i wywołaj jego Lock
funkcje składowe i Unlock
. CCriticalSection
Jeśli obiekt jest używany autonomicznie, wywołaj jego Unlock
funkcję składową, aby ją zwolnić.
Jeśli konstruktor nie może przydzielić wymaganej pamięci systemowej, zostanie automatycznie zgłoszony wyjątek pamięci (typu CMemoryException
).
Przykład
Zobacz przykład CCriticalSection::Lock.
CCriticalSection::Lock
Wywołaj tę funkcję składową, aby uzyskać dostęp do obiektu sekcji krytycznej.
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
Parametry
dwTimeout
Lock
Ignoruje tę wartość parametru.
Wartość zwracana
Nonzero, jeśli funkcja zakończyła się pomyślnie; w przeciwnym razie 0.
Uwagi
Lock
jest wywołaniem blokującym, które nie zostanie zwrócone, dopóki obiekt sekcji krytycznej nie zostanie zasygnalizowany (stanie się dostępny).
Jeśli wymagane są czasy oczekiwania, możesz użyć CMutex
obiektu zamiast CCriticalSection
obiektu.
Jeśli Lock
nie można przydzielić niezbędnej pamięci systemowej, zostanie automatycznie zgłoszony wyjątek pamięci (typu CMemoryException
).
Przykład
W tym przykładzie pokazano podejście sekcji krytycznej zagnieżdżonej przez kontrolowanie dostępu do udostępnionego zasobu (obiektu statycznego _strShared
) przy użyciu obiektu udostępnionego CCriticalSection
. Funkcja SomeMethod
demonstruje aktualizowanie zasobu udostępnionego w bezpieczny sposób.
//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
Zawiera obiekt sekcji krytycznej, który jest używany przez wszystkie CCriticalSection
metody.
CRITICAL_SECTION m_sect;
CCriticalSection::operator CRITICAL_SECTION*
CRITICAL_SECTION
Pobiera obiekt.
operator CRITICAL_SECTION*();
Uwagi
Wywołaj tę funkcję, aby pobrać wskaźnik do obiektu wewnętrznego CRITICAL_SECTION
.
CCriticalSection::Unlock
CCriticalSection
Zwalnia obiekt do użycia przez inny wątek.
BOOL Unlock();
Wartość zwracana
Nonzero, jeśli CCriticalSection
obiekt był własnością wątku, a wydanie zakończyło się pomyślnie; w przeciwnym razie 0.
Uwagi
CCriticalSection
Jeśli element jest używany autonomicznie, Unlock
należy wywołać go natychmiast po zakończeniu korzystania z zasobu kontrolowanego przez sekcję krytyczną. CSingleLock
Jeśli obiekt jest używany, CCriticalSection::Unlock
zostanie wywołany przez funkcję składową obiektu blokadyUnlock
.
Przykład
Zobacz przykład dla elementu CCriticalSection::Lock
.