Compartilhar via


Função EnterSynchronizationBarrier (synchapi.h)

Faz com que o thread de chamada aguarde em uma barreira de sincronização até que o número máximo de threads tenha entrado na barreira.

Sintaxe

BOOL EnterSynchronizationBarrier(
  [in, out] LPSYNCHRONIZATION_BARRIER lpBarrier,
  [in]      DWORD                     dwFlags
);

Parâmetros

[in, out] lpBarrier

Um ponteiro para uma barreira de sincronização inicializada. Use a função InitializeSynchronizationBarrier para inicializar a barreira. SYNCHRONIZATION_BARRIER é uma estrutura opaca que não deve ser modificada pelo aplicativo.

[in] dwFlags

Sinalizadores que controlam o comportamento dos threads que entram nessa barreira. Esse parâmetro pode usar um dos valores a seguir:

Valor Significado
SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY Especifica que o thread que entra na barreira deve ser bloqueado imediatamente até que o último thread entre na barreira. Para obter mais informações, consulte Comentários.
SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY Especifica que o thread que entra na barreira deve girar até que o último thread entre na barreira, mesmo que o thread giratório exceda a contagem máxima de rotação da barreira. Para obter mais informações, consulte Comentários.
SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE Especifica que a função pode ignorar o trabalho necessário para garantir que seja seguro excluir a barreira, o que pode melhorar o desempenho. Todos os threads que inserem essa barreira devem especificar o sinalizador; caso contrário, o sinalizador será ignorado. Esse sinalizador só deverá ser usado se a barreira nunca for excluída.

Retornar valor

TRUE para o último thread sinalizar a barreira. Threads que sinalizam a barreira antes do último thread sinalizam que ela recebe um valor retornado de FALSE.

Comentários

O comportamento padrão para threads que entram em uma barreira de sincronização é girar até que a contagem máxima de rotação da barreira seja atingida e, em seguida, bloquear. Isso permite que os threads retomem rapidamente se o último thread entrar na barreira em um tempo relativamente curto. No entanto, se o último thread demorar relativamente mais tempo para chegar, os threads já estão no bloco de barreira para que eles parem de consumir o tempo do processador enquanto aguardam.

Um thread pode substituir o comportamento padrão da barreira especificando SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY ou SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY. No entanto, tenha em mente que o uso desses sinalizadores pode afetar o desempenho. Girar indefinidamente impede um processador de atender outros threads, enquanto o bloqueio prematuro incorre na sobrecarga de trocar o thread do processador, despertar o thread quando ele é desbloqueado e trocá-lo novamente para o processador. Em geral, é melhor permitir que a barreira gerencie threads e use esses sinalizadores somente se o teste de desempenho indicar que o aplicativo se beneficiaria deles.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 8 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2012 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho synchapi.h
Biblioteca Kernel32.lib
DLL Kernel32.dll

Confira também

DeleteSynchronizationBarrier

InitializeSynchronizationBarrier

Barreiras de sincronização

APIs Vertdll disponíveis em enclaves de VBS