Barreiras de sincronização
Uma barreira de sincronização permite que vários threads aguardem até que todos os threads tenham atingido um determinado ponto de execução antes que qualquer thread continue. As barreiras de sincronização não podem ser compartilhadas entre processos.
As barreiras de sincronização são úteis para cálculos em fases, nos quais os threads que executam o mesmo código em paralelo devem concluir uma fase antes de passar para a próxima.
Para criar uma barreira de sincronização, chame a função InitializeSynchronizationBarrier e especifique um número máximo de threads e quantas vezes um thread deve girar antes de bloquear. Em seguida, inicie os threads que usarão a barreira. Depois que cada thread concluir seu trabalho, ele chamará EnterSynchronizationBarrier para aguardar na barreira. A função EnterSynchronizationBarrier bloqueia cada thread até que o número de threads bloqueados na barreira atinja a contagem máxima de threads para a barreira, momento em que EnterSynchronizationBarrier desbloqueia todos os threads. A função EnterSynchronizationBarrier retorna TRUE para exatamente um dos threads que entraram na barreira e retorna FALSE para todos os outros threads.
Para liberar uma barreira de sincronização quando ela não for mais necessária, chame DeleteSynchronizationBarrier. É seguro chamar essa função imediatamente após chamar EnterSynchronizationBarrier porque essa função garante que todos os threads tenham terminado de usar a barreira antes de serem lançadas.
Se uma barreira de sincronização nunca for excluída, os threads poderão especificar o sinalizador SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE quando entrarem na barreira. Todos os threads que usam a barreira devem especificar esse sinalizador; se qualquer thread não o fizer, o sinalizador será ignorado. Esse sinalizador faz com que a função ignore o trabalho extra necessário para a segurança de exclusão, o que pode melhorar o desempenho. Observe que excluir uma barreira enquanto esse sinalizador estiver em vigor pode resultar em um acesso de identificador inválido e um ou mais threads permanentemente bloqueados.