Funzione EnterSynchronizationBarrier (synchapi.h)
Causa l'attesa del thread chiamante in una barriera di sincronizzazione fino al numero massimo di thread immessi nella barriera.
Sintassi
BOOL EnterSynchronizationBarrier(
[in, out] LPSYNCHRONIZATION_BARRIER lpBarrier,
[in] DWORD dwFlags
);
Parametri
[in, out] lpBarrier
Puntatore a una barriera di sincronizzazione inizializzata. Utilizzare la funzione InitializeSynchronizationBarrier per inizializzare la barriera. SYNCHRONIZATION_BARRIER è una struttura opaca che non deve essere modificata dall'applicazione.
[in] dwFlags
Flag che controllano il comportamento dei thread che entrano in questa barriera. Questo parametro può essere uno o più dei valori seguenti:
Valore | Significato |
---|---|
SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY | Specifica che il thread che immette la barriera deve bloccare immediatamente finché l'ultimo thread entra nella barriera. Per altre informazioni, vedere la sezione Osservazioni. |
SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY | Specifica che il thread che immette la barriera deve ruotare fino all'ultimo thread che entra nella barriera, anche se il thread di rotazione supera il numero massimo di spin della barriera. Per altre informazioni, vedere la sezione Osservazioni. |
SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE | Specifica che la funzione può ignorare il lavoro necessario per garantire che sia sicuro eliminare la barriera, che può migliorare le prestazioni. Tutti i thread che entrano in questa barriera devono specificare il flag; in caso contrario, il flag viene ignorato. Questo flag deve essere usato solo se la barriera non verrà mai eliminata. |
Valore restituito
TRUE
per l'ultimo thread per segnalare la barriera. Thread che segnalano la barriera prima dell'ultimo thread segnala che riceve un valore restituito di FALSE
.
Commenti
Il comportamento predefinito per i thread che entrano in una barriera di sincronizzazione consiste nello spining fino al raggiungimento del numero massimo di spin della barriera e quindi blocca. Ciò consente ai thread di riprendere rapidamente se l'ultimo thread entra nella barriera in un tempo relativamente breve. Tuttavia, se l'ultimo thread richiede relativamente più tempo per arrivare, i thread già nel blocco di barriere non richiedono tempo di elaborazione durante l'attesa.
Un thread può eseguire l'override del comportamento predefinito della barriera specificando SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY o SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY. Tenere tuttavia presente che l'uso di questi flag può influire sulle prestazioni. La rotazione indefinita mantiene un processore di manutenzione di altri thread, mentre il blocco prematuro comporta il sovraccarico dello scambio del thread dal processore, risveglia il thread quando si sblocca e lo scambia nuovamente nel processore. In generale, è meglio consentire alla barriera di gestire i thread e usare questi flag solo se i test delle prestazioni indicano che l'applicazione potrebbe trarre vantaggio da essi.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 8 [solo app desktop] |
Server minimo supportato | Windows Server 2012 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | synchapi.h |
Libreria | Kernel32.lib |
DLL | Kernel32.dll |