Obstacles de synchronisation
Une barrière de synchronisation permet à plusieurs threads d’attendre que tous les threads aient tous atteint un point d’exécution particulier avant qu’un thread ne continue. Les obstacles de synchronisation ne peuvent pas être partagés 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 tous effectuer une 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 le nombre de fois où un thread doit tourner avant de se bloquer. Lancez ensuite les threads qui utiliseront la barrière. Une fois que chaque thread a terminé son travail, il appelle EnterSynchronizationBarrier pour attendre au niveau de 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 cas 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 FALSE pour tous les autres threads.
Pour libérer une barrière de synchronisation quand elle n’est plus nécessaire, appelez DeleteSynchronizationBarrier. Il est possible d’appeler cette fonction immédiatement après l’appel d’EnterSynchronizationBarrier , car cette fonction garantit que tous les threads ont terminé d’utiliser la barrière avant qu’ils ne soient libérés.
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 un thread ne le fait pas, l’indicateur est ignoré. Cet indicateur fait que la fonction ignore 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 de manière permanente.