Condividi tramite


Classe CCriticalSection

Rappresenta una "sezione critica", ovvero un oggetto di sincronizzazione che consente a un thread alla volta di accedere a una risorsa o a una sezione di codice.

Sintassi

class CCriticalSection : public CSyncObject

Membri

Costruttori pubblici

Nome Descrizione
CCriticalSection::CCriticalSection Costruisce un oggetto CCriticalSection.

Metodi pubblici

Nome Descrizione
CCriticalSection::Lock Utilizzare per ottenere l'accesso all'oggetto CCriticalSection .
CCriticalSection::Unlock Rilascia l'oggetto CCriticalSection.

Operatori pubblici

Nome Descrizione
CCriticalSection::operator CRITICAL_SECTION* Recupera un puntatore all'oggetto interno CRITICAL_SECTION .

Membri dati pubblici

Nome Descrizione
CCriticalSection::m_sect Oggetto CRITICAL_SECTION.

Osservazioni:

Le sezioni critiche sono utili quando è possibile modificare dati o altre risorse controllate solo un thread alla volta. Ad esempio, l'aggiunta di nodi a un elenco collegato è un processo che deve essere consentito solo da un thread alla volta. Usando un CCriticalSection oggetto per controllare l'elenco collegato, un solo thread alla volta può ottenere l'accesso all'elenco.

Nota

La funzionalità della CCriticalSection classe viene fornita da un oggetto Win32 CRITICAL_SECTION effettivo.

Le sezioni critiche vengono usate invece di mutex (vedere CMutex) quando la velocità è critica e la risorsa non verrà usata attraverso i limiti del processo.

Esistono due metodi per l'uso di un CCriticalSection oggetto: autonomo e incorporato in una classe.

  • Metodo autonomo Per usare un oggetto autonomo CCriticalSection , costruire l'oggetto CCriticalSection quando necessario. Dopo aver restituito correttamente dal costruttore, bloccare in modo esplicito l'oggetto con una chiamata a Lock. Chiamare Unlock al termine dell'accesso alla sezione critica. Questo metodo, mentre più chiaro a un utente che legge il codice sorgente, è più soggetto a errori, perché è necessario ricordare di bloccare e sbloccare la sezione critica prima e dopo l'accesso.

    Un metodo più preferibile consiste nell'usare la CSingleLock classe . Include anche un Lock metodo e Unlock , ma non è necessario preoccuparsi di sbloccare la risorsa se si verifica un'eccezione.

  • Metodo incorporato È anche possibile condividere una classe con più thread aggiungendo un CCriticalSectionmembro dati -type alla classe e bloccando il membro dati quando necessario.

Per altre informazioni sull'uso CCriticalSection di oggetti, vedere l'articolo Multithreading: Come usare le classi di sincronizzazione.

Gerarchia di ereditarietà

CObject

CSyncObject

CCriticalSection

Requisiti

Intestazione: afxmt.h

CCriticalSection::CCriticalSection

Costruisce un oggetto CCriticalSection.

CCriticalSection();

Osservazioni:

Per accedere o rilasciare un oggetto, creare un CCriticalSection CSingleLock oggetto e chiamarne Lock le funzioni membro e Unlock . Se l'oggetto CCriticalSection viene usato in modalità autonoma, chiamare la funzione Unlock membro per rilasciarla.

Se il costruttore non riesce ad allocare la memoria di sistema richiesta, viene generata automaticamente un'eccezione di memoria (di tipo CMemoryException).

Esempio

Vedere l'esempio per CCriticalSection::Lock.

CCriticalSection::Lock

Chiamare questa funzione membro per ottenere l'accesso all'oggetto sezione critica.

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

Parametri

dwTimeoutLock ignora questo valore di parametro.

Valore restituito

Diverso da zero se la funzione ha avuto esito positivo; in caso contrario, 0.

Osservazioni:

Lock è una chiamata di blocco che non restituisce finché l'oggetto sezione critica non viene segnalato (diventa disponibile).

Se sono necessarie attese temporali, è possibile usare un CMutex oggetto anziché un CCriticalSection oggetto .

Se Lock non si alloca la memoria di sistema necessaria, viene generata automaticamente un'eccezione di memoria (di tipo CMemoryException).

Esempio

In questo esempio viene illustrato l'approccio alla sezione critica annidata controllando l'accesso a una risorsa condivisa (l'oggetto statico _strShared ) usando un oggetto condiviso CCriticalSection . La SomeMethod funzione illustra l'aggiornamento di una risorsa condivisa in modo sicuro.

//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

Contiene un oggetto sezione critico utilizzato da tutti i CCriticalSection metodi.

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

Recupera un CRITICAL_SECTION oggetto .

operator CRITICAL_SECTION*();

Osservazioni:

Chiamare questa funzione per recuperare un puntatore all'oggetto interno CRITICAL_SECTION .

CCriticalSection::Unlock

Rilascia l'oggetto CCriticalSection da utilizzare da un altro thread.

BOOL Unlock();

Valore restituito

Diverso da zero se l'oggetto CCriticalSection è di proprietà del thread e la versione ha avuto esito positivo; in caso contrario, 0.

Osservazioni:

Se l'oggetto CCriticalSection viene usato in modalità autonoma, Unlock deve essere chiamato immediatamente dopo aver completato l'uso della risorsa controllata dalla sezione critica. Se viene usato un CSingleLock oggetto, CCriticalSection::Unlock verrà chiamato dalla funzione membro dell'oggetto Unlock lock.

Esempio

Vedere l'esempio per CCriticalSection::Lock.

Vedi anche

CSyncObject Classe
Grafico della gerarchia
CMutex Classe