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'oggettoCCriticalSection
quando necessario. Dopo aver restituito correttamente dal costruttore, bloccare in modo esplicito l'oggetto con una chiamata aLock
. ChiamareUnlock
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 unLock
metodo eUnlock
, 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
CCriticalSection
membro 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à
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
dwTimeout
Lock
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
.