Udostępnij za pośrednictwem


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 , skonstruuj CCriticalSection obiekt, gdy jest potrzebny. Po pomyślnym powrocie z konstruktora jawnie zablokuj obiekt za pomocą wywołania metody Lock. Wywołaj połączenie Unlock 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 i Unlock , 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ą CCriticalSectiondanych 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

CObject

CSyncObject

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

dwTimeoutLock 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.

Zobacz też

CSyncObject Klasa
Wykres hierarchii
CMutex Klasa