Condividi tramite


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

Vedere anche

DeleteSynchronizationBarrier

InitializeSynchronizationBarrier

Barriere di sincronizzazione

API Vertdll disponibili nelle enclave VBS