Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Classe
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'oggettoCCriticalSectionquando necessario. Dopo aver restituito correttamente dal costruttore, bloccare in modo esplicito l'oggetto con una chiamata aLock. ChiamareUnlockal 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
CSingleLockclasse . Include anche unLockmetodo 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
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à
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.