Funzione InitializeCriticalSectionAndSpinCount (synchapi.h)

Inizializza un oggetto sezione critica e imposta il numero di spin per la sezione critica. Quando un thread tenta di acquisire una sezione critica bloccata, il thread gira: entra in un ciclo che esegue l'iterazione dei tempi di conteggio degli spin, verificando se il blocco viene rilasciato. Se il blocco non viene rilasciato prima del completamento del ciclo, il thread passa al sonno per attendere il rilascio del blocco.

Sintassi

BOOL InitializeCriticalSectionAndSpinCount(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount
);

Parametri

[out] lpCriticalSection

Puntatore all'oggetto sezione critica.

[in] dwSpinCount

Numero di spin per l'oggetto sezione critica. Nei sistemi a processore singolo il conteggio di spin viene ignorato e il conteggio di spin della sezione critica è impostato su 0 (zero). Nei sistemi multiprocessore, se la sezione critica non è disponibile, il thread chiamante spins dwSpinCount volte prima di eseguire un'operazione di attesa in un semaforo associato alla sezione critica. Se la sezione critica diventa libera durante l'operazione di spin, il thread chiamante evita l'operazione di attesa.

Valore restituito

Questa funzione ha sempre esito positivo e restituisce un valore diverso da zero.

Windows Server 2003 e Windows XP: 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. A partire da Windows Vista, la funzione InitializeCriticalSectionAndSpinCount riesce sempre, anche in situazioni di memoria ridotta.

Commenti

I thread di un singolo processo possono usare un oggetto di sezione critico per la sincronizzazione reciproca dell'esclusione. Non esiste alcuna garanzia sull'ordine in cui i thread ottengono la proprietà della sezione critica. Tuttavia, il sistema è equo a tutti i thread.

Il processo è responsabile dell'allocazione della memoria utilizzata 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 di spin chiamando la funzione SetCriticalSectionSpinCount .

Dopo l'inizializzazione di un oggetto di 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.

Impossibile spostare o copiare un oggetto di sezione critica. Il processo non deve anche modificare l'oggetto, ma deve considerarlo come logicamente opaco. Usare solo le funzioni di sezione critiche per gestire gli oggetti di sezione critici. Al termine dell'uso della sezione critica, chiamare la funzione DeleteCriticalSection .

Un oggetto sezione critica deve essere eliminato prima di poter essere reinizializzato. Inizializzazione di una sezione critica che è già inizializzata comporta un comportamento non definito.

Il conteggio di spin è utile per le 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 allocare costantemente e rilasciare 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 di spin è impostato correttamente, il thread chiamante non chiama immediatamente WaitForSingleObject quando si verifica la contesa. Il thread chiamante può invece acquisire la proprietà della sezione critica se viene rilasciata durante l'operazione di spin.

È possibile migliorare significativamente le prestazioni scegliendo un piccolo conteggio di spin per una sezione critica di breve durata. Ad esempio, il responsabile heap usa un conteggio di rotazione di circa 4.000 per le relative sezioni critiche per heap.

Per compilare un'applicazione che usa questa funzione, definire _WIN32_WINNT come 0x0403 o versioni successive. Per altre informazioni, vedere Uso delle intestazioni di Windows.

Esempio

Per un esempio che usa InitializeCriticalSectionAndSpinCount, vedere Uso di oggetti di sezione critici.

Requisiti

   
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 (includere 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

InitializeCriticalSectionEx

SetCriticalSectionSpinCount

Funzioni di sincronizzazione

WaitForSingleObject

API Vertdll disponibili nelle enclave VBS