Synchronisierungsbarrieren
Eine Synchronisierungsbarriere ermöglicht es mehreren Threads, zu warten, bis alle Threads einen bestimmten Ausführungspunkt erreicht haben, bevor ein Thread fortgesetzt wird. Synchronisierungsbarrieren können nicht prozessübergreifend freigegeben werden.
Synchronisierungsbarrieren sind nützlich für phasenweise Berechnungen, bei denen Threads, die denselben Code parallel ausführen, alle eine Phase durchlaufen müssen, bevor sie mit der nächsten fortfahren.
Um eine Synchronisierungsbarriere zu erstellen, rufen Sie die InitializeSynchronizationBarrier-Funktion auf, und geben Sie eine maximale Anzahl von Threads an und wie oft ein Thread gedreht werden soll, bevor er blockiert wird. Starten Sie dann die Threads, die die Barriere verwenden. Nachdem jeder Thread seine Arbeit abgeschlossen hat, ruft er EnterSynchronizationBarrier auf, um an der Barriere zu warten. Die EnterSynchronizationBarrier-Funktion blockiert jeden Thread, bis die Anzahl der in der Barriere blockierten Threads die maximale Threadanzahl für die Barriere erreicht. An diesem Punkt hebt EnterSynchronizationBarrier die Blockierung aller Threads auf. Die EnterSynchronizationBarrier-Funktion gibt true für genau einen der Threads zurück, die die Barriere betreten haben, und false für alle anderen Threads.
Um eine Synchronisierungsbarriere freizugeben, wenn sie nicht mehr benötigt wird, rufen Sie DeleteSynchronizationBarrier auf. Es ist sicher, diese Funktion sofort nach dem Aufruf von EnterSynchronizationBarrier aufzurufen, da diese Funktion sicherstellt, dass alle Threads die Barriere verwendet haben, bevor sie freigegeben wird.
Wenn eine Synchronisierungsbarriere nie gelöscht wird, können Threads das flag SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE angeben, wenn sie die Barriere betreten. Alle Threads, die die Barriere verwenden, müssen dieses Flag angeben. Wenn dies bei einem Thread nicht der Fall ist, wird das Flag ignoriert. Dieses Flag bewirkt, dass die Funktion den zusätzlichen Aufwand überspringt, der für die Löschsicherheit erforderlich ist, was die Leistung verbessern kann. Beachten Sie, dass das Löschen einer Barriere, während dieses Flag wirksam ist, zu einem ungültigen Handle-Zugriff und einem oder mehreren dauerhaft blockierten Threads führen kann.