Funzione EnterCriticalSection (synchapi.h)

Attende la proprietà dell'oggetto sezione critica specificata. La funzione restituisce quando al thread chiamante viene concessa la proprietà.

Sintassi

void EnterCriticalSection(
  [in, out] LPCRITICAL_SECTION lpCriticalSection
);

Parametri

[in, out] lpCriticalSection

Puntatore all'oggetto sezione critica.

Valore restituito

Questa funzione non restituisce un valore.

Questa funzione può generare EXCEPTION_POSSIBLE_DEADLOCK, nota anche come STATUS_POSSIBLE_DEADLOCK, se si verifica un timeout di un'operazione di attesa nella sezione critica. L'intervallo di timeout viene specificato dal valore del Registro di sistema seguente: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout. Non gestire una possibile eccezione di deadlock; eseguire invece il debug dell'applicazione.

Commenti

I thread di un singolo processo possono usare un oggetto sezione critica per la sincronizzazione dell'esclusione reciproca. Il processo è responsabile dell'allocazione della memoria usata da un oggetto sezione critica, che può eseguire dichiarando una variabile di tipo CRITICAL_SECTION. Prima di usare una sezione critica, alcuni thread del processo devono chiamare InitializeCriticalSection o InitializeCriticalSectionAndSpinCount per inizializzare l'oggetto.

Per abilitare l'accesso reciproco esclusivo a una risorsa condivisa, ogni thread chiama la funzione EnterCriticalSection o TryEnterCriticalSection per richiedere la proprietà della sezione critica prima di eseguire qualsiasi sezione di codice che accede alla risorsa protetta. La differenza è che TryEnterCriticalSection restituisce immediatamente, indipendentemente dal fatto che abbia ottenuto la proprietà della sezione critica, mentre EnterCriticalSection blocca fino a quando il thread non può assumere la proprietà della sezione critica. Al termine dell'esecuzione del codice protetto, il thread usa la funzione LeaveCriticalSection per rinunciare alla proprietà, consentendo a un altro thread di diventare proprietario e accedere alla risorsa protetta. Non esiste alcuna garanzia sull'ordine in cui i thread in attesa acquisiranno la proprietà della sezione critica.

Dopo che un thread ha la proprietà di una sezione critica, può effettuare chiamate aggiuntive a EnterCriticalSection o TryEnterCriticalSection senza bloccarne l'esecuzione. Ciò impedisce a un thread di bloccarsi durante l'attesa di una sezione critica già proprietaria. Il thread entra nella sezione critica ogni volta che EnterCriticalSection e TryEnterCriticalSection hanno esito positivo. Un thread deve chiamare LeaveCriticalSection una volta per ogni volta che ha immesso la sezione critica.

Qualsiasi thread del processo può usare la funzione DeleteCriticalSection per rilasciare le risorse di sistema allocate durante l'inizializzazione dell'oggetto sezione critica. Dopo aver chiamato questa funzione, l'oggetto sezione critica non può più essere usato per la sincronizzazione.

Se un thread termina mentre ha la proprietà di una sezione critica, lo stato della sezione critica non è definito.

Se una sezione critica viene eliminata mentre è ancora di proprietà, lo stato dei thread in attesa della proprietà della sezione critica eliminata non è definito.

Mentre un processo viene chiuso, se una chiamata a EnterCriticalSection viene bloccata , il processo verrà terminato immediatamente. Ciò può causare la mancata chiamata dei distruttori globali.

Esempio

Per un esempio che usa EnterCriticalSection, vedere Using Critical Section Objects.For an example that using EnterCriticalSection, see Using Critical Section Objects.

Requisiti

Requisito Valore
Client minimo supportato Windows XP [app desktop | App UWP]
Server minimo supportato Windows Server 2003 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione synchapi.h (include Windows.h in Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Libreria Kernel32.lib
DLL Kernel32.dll

Vedere anche

Oggetti sezione critica

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

Funzioni di sincronizzazione

TryEnterCriticalSection

API Vertdll disponibili nelle enclave VBS