Funzione InitializeCriticalSectionEx (synchapi.h)
Inizializza un oggetto sezione critica con un conteggio di rotazioni e flag facoltativi.
Sintassi
BOOL InitializeCriticalSectionEx(
[out] LPCRITICAL_SECTION lpCriticalSection,
[in] DWORD dwSpinCount,
[in] DWORD Flags
);
Parametri
[out] lpCriticalSection
Puntatore all'oggetto sezione critica.
[in] dwSpinCount
Numero di rotazioni per l'oggetto sezione critica. Nei sistemi a processore singolo, il conteggio delle rotazioni viene ignorato e il numero di rotazioni della sezione critica è impostato su 0 (zero). Nei sistemi multiprocessore, se la sezione critica non è disponibile, il thread chiamante spin dwSpinCount volte prima di eseguire un'operazione di attesa su un semaforo associato alla sezione critica. Se la sezione critica diventa libera durante l'operazione di selezione, il thread chiamante evita l'operazione di attesa.
[in] Flags
Questo parametro può essere 0 o il valore seguente.
Valore | Significato |
---|---|
CRITICAL_SECTION_NO_DEBUG_INFO | La sezione critica viene creata senza informazioni di debug. |
Valore restituito
Se la funzione ha esito positivo, il valore restituito è diverso da zero.
Se la funzione ha esito negativo, il valore restituito è zero (0). Per informazioni dettagliate sull'errore, chiamare GetLastError.
Commenti
I thread di un singolo processo possono usare un oggetto sezione critica per la sincronizzazione dell'esclusione reciproca. Non esiste alcuna garanzia sull'ordine in cui i thread ottengono la proprietà della sezione critica, ma il sistema è equo a tutti i thread.
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 inizializzare l'oggetto. Successivamente, è possibile modificare il conteggio delle rotazioni chiamando la funzione SetCriticalSectionSpinCount .
Dopo l'inizializzazione di un oggetto sezione critica, i thread del processo possono specificare l'oggetto nella funzione EnterCriticalSection, TryEnterCriticalSection o LeaveCriticalSection per fornire l'accesso reciproco esclusivo a una risorsa condivisa. Per una sincronizzazione simile tra i thread di processi diversi, usare un oggetto mutex.
Non è possibile spostare o copiare un oggetto sezione critica. Il processo non deve anche modificare l'oggetto, ma deve considerarlo come opaco logicamente. Usare solo le funzioni della sezione critica per gestire gli oggetti sezione critica. Al termine dell'uso della sezione critica, chiamare la funzione DeleteCriticalSection .
Prima di poter essere reinizializzato, è necessario eliminare un oggetto sezione critica. L'inizializzazione di una sezione critica già inizializzata comporta un comportamento non definito.
Il conteggio delle rotazioni è utile per sezioni critiche di breve durata che possono sperimentare livelli elevati di contesa. Si consideri uno scenario peggiore, in cui un'applicazione in un sistema SMP ha due o tre thread allocando e rilasciando costantemente memoria dall'heap. L'applicazione serializza l'heap con una sezione critica. Nello scenario peggiore, la contesa per la sezione critica è costante e ogni thread effettua una chiamata a elevato utilizzo di elaborazione alla funzione WaitForSingleObject . Tuttavia, se il conteggio delle rotazioni è impostato correttamente, il thread chiamante non chiama immediatamente WaitForSingleObject quando si verifica una contesa. Il thread chiamante può invece acquisire la proprietà della sezione critica se viene rilasciata durante l'operazione di rotazione.
È possibile migliorare significativamente le prestazioni scegliendo un piccolo conteggio di rotazioni per una sezione critica di breve durata. Il responsabile dell'heap usa un conteggio di rotazione di circa 4000 per le relative sezioni critiche per heap. Ciò offre prestazioni e scalabilità ottimali in quasi tutti gli scenari peggiori.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows Vista [app desktop | App UWP] |
Server minimo supportato | Windows Server 2008 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | synchapi.h (include Windows.h in Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Libreria | Kernel32.lib |
DLL | Kernel32.dll |