Partager via


Barrières de synchronisation

Une barrière de synchronisation permet à plusieurs threads d’attendre jusqu’à ce que tous les threads aient atteint un point particulier d’exécution avant que n’importe quel thread continue. Les barrières de synchronisation ne peuvent pas être partagées entre les processus.

Les barrières de synchronisation sont utiles pour les calculs par phases, dans lesquels les threads exécutant le même code en parallèle doivent effectuer une seule phase avant de passer à la suivante.

Pour créer une barrière de synchronisation, appelez la fonction InitializeSynchronizationBarrier et spécifiez un nombre maximal de threads et combien de fois un thread doit tourner avant de bloquer. Lancez ensuite les threads qui utiliseront la barrière. Une fois que chaque thread a terminé son travail, il appelle EnterSynchronizationBarrier attendre à la barrière. La fonction EnterSynchronizationBarrier bloque chaque thread jusqu’à ce que le nombre de threads bloqués dans la barrière atteigne le nombre maximal de threads pour la barrière, auquel point EnterSynchronizationBarrier débloque tous les threads. La fonction EnterSynchronizationBarrier retourne TRUE pour exactement l’un des threads entrés dans la barrière et retourne FAUX pour tous les autres threads.

Pour libérer une barrière de synchronisation lorsqu’elle n’est plus nécessaire, appelez DeleteSynchronizationBarrier. Il est sûr d’appeler cette fonction immédiatement après avoir appelé EnterSynchronizationBarrier, car cette fonction garantit que tous les threads ont fini d’utiliser la barrière avant sa libération.

Si une barrière de synchronisation ne sera jamais supprimée, les threads peuvent spécifier l’indicateur SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE lorsqu’ils entrent dans la barrière. Tous les threads utilisant la barrière doivent spécifier cet indicateur ; si aucun thread ne le fait, l’indicateur est ignoré. Cet indicateur permet à la fonction d’ignorer le travail supplémentaire requis pour la sécurité de suppression, ce qui peut améliorer les performances. Notez que la suppression d’une barrière pendant que cet indicateur est en vigueur peut entraîner un accès de handle non valide et un ou plusieurs threads bloqués définitivement.