Barriere di sincronizzazione
Una barriera di sincronizzazione consente a più thread di attendere fino a quando tutti i thread hanno raggiunto un determinato punto di esecuzione prima che qualsiasi thread continui. Le barriere di sincronizzazione non possono essere condivise tra processi.
Le barriere di sincronizzazione sono utili per i calcoli in più fasi, in cui i thread che eseguono lo stesso codice in parallelo devono completare tutte le fasi prima di passare alla successiva.
Per creare una barriera di sincronizzazione, chiamare la funzione InitializeSynchronizationBarrier e specificare un numero massimo di thread e quante volte un thread deve ruotare prima di bloccarlo. Avviare quindi i thread che useranno la barriera. Al termine del lavoro di ogni thread, chiama EnterSynchronizationBarrier per attendere la barriera. La funzione EnterSynchronizationBarrier blocca ogni thread finché il numero di thread bloccati nella barriera raggiunge il numero massimo di thread per la barriera, a quel punto EnterSynchronizationBarrier sblocca tutti i thread. La funzione EnterSynchronizationBarrier restituisce TRUE per esattamente uno dei thread immessi nella barriera e restituisce FALSE per tutti gli altri thread.
Per rilasciare una barriera di sincronizzazione quando non è più necessaria, chiamare DeleteSynchronizationBarrier. È sicuro chiamare questa funzione immediatamente dopo aver chiamato EnterSynchronizationBarrier perché tale funzione garantisce che tutti i thread siano stati completati usando la barriera prima che venga rilasciata.
Se una barriera di sincronizzazione non verrà mai eliminata, i thread possono specificare il flag di SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE quando entrano nella barriera. Tutti i thread che usano la barriera devono specificare questo flag; se qualsiasi thread non viene ignorato, il flag viene ignorato. Questo flag consente alla funzione di ignorare il lavoro aggiuntivo richiesto per la sicurezza dell'eliminazione, che può migliorare le prestazioni. Si noti che l'eliminazione di una barriera mentre questo flag è effettivo può causare un accesso di handle non valido e uno o più thread bloccati definitivamente.