Frage

Ich nehme C# 4.0 auf und eines der Dinge, die mich verwirrt, ist das Barrier -Konzept.

Ist das nicht nur wie die Verwendung der WaitAll Methode von WaitHandle? Wart das nicht auf alle Fäden?

Ich habe das Barrier -Konstrukt auf dieser Seite gelernt: http://www.managed-world.com/archive/2009/02/09/an-intro-tro-barrier.aspx

Es scheint jedoch genau wie das WaitAll Methode. Was vermisse ich? Was ist der Unterschied hier?

Vielen Dank.

War es hilfreich?

Lösung

Es hört sich so an, als wären Sie neugierig, warum eine Barriere gegenüber einem Waithandle + Waitforall -Derivat bevorzugt wird? Beide können ein ähnliches Ziel erreichen, wenn sie richtig strukturiert werden.

Ich bin mit Barriere nicht sehr vertraut, aber ein Vorteil, der mich herausspringt, ist ein Ressourcenproblem. Um N -Threads mit einer Barriere zu synchronisieren, erfordert nur eine einzelne Barrierinstanz. Um N -Threads über einen WaitHandle und Waitall zu synchronisieren, sind N -Griffe erforderlich. Diese Ressourcen sind billig, aber nicht kostenlos. Die Reduzierung der Anzahl der Ressourcen zur Synchronisierung einer Gruppe von Threads hat ihre Vorteile.

Andere Tipps

Sehen Barriere. Es wartet darauf, dass eine Gruppe mehrerer Threads einen bestimmten Punkt anstelle eines anstelle eines erreicht. Es wird häufig in wissenschaftlichem Computer und Simulation verwendet, um Zeit "Zecken" darzustellen.

Stellen Sie sich ein 1000 x 1000 x 1000 Würfelnetz vor, die Kubikmeile Luft darstellen. Zum Zeitpunkt Null wird ein bestimmter Einheitswürfel von den verschiedenen Parametern der Nachbarn wie Temperatur und Druck beeinflusst. Sobald jeder Zeit 1 berechnet, tun Sie das Gleiche für Zeit 2 ... Sie erhalten eine Wettersimulation. Ähnliche Geschichte für die Kernsimulation.

Es gibt auch eine Variation der Barriere genannt Cyclicbarrier Wo es Themen akzeptiert, die nicht von der Startlinie abgenommen haben, und es nach einiger Zeit wieder in die Gruppe zurückbleiben. Aus der Dokumentation geht nicht hervor, ob die Barriere von C# 4 eine zyklische Barriere ist, aber es gibt eine Eigenschaft namens Teilnehmern.

Barrier Bietet ein höheres Maß an Abstraktion und Bequemlichkeit: eine einzige SignalAndWait Call ist alles, was jeder Thread erledigen muss, anstatt wissen zu müssen, welches Handle im Array es signalisieren (oder einen Mutex verwenden sollte, um den "nächsten verfügbaren Punkt im Array" zu finden und zu erhöhen, und das zu signalisieren) und zuerst zu signalisieren müssen und dann WaitAll.

Am Ende können Sie natürlich dieselbe Synchronisationsaufgabe durch angemessene Verwendung anderer Synchronisationsmechanismen ausführen, jedoch für ein so gemeinsames Verwendungsmuster wie Barrier verkörpert es, es ist praktisch, eine so bequeme und narrensichere Lösung bereits dort zu haben und ordentlich verpackt ;-).

Waitfor ist eine Transact -SQL -Anweisung. Es blockiert die Ausführung eines Stapels, eines gespeicherten Prozesses oder einer Transaktion, bis ein bestimmtes Zeitintervall erreicht ist oder eine angegebene Anweisung mindestens eine Zeile ändert oder zurückgibt.

Eine Barriere ist eine Synchronisationsprimitive, die die Ausführung zwischen einer Reihe von Threads oder Prozessen an einem bestimmten Punkt erzwingt und eine weitere Ausführung verhindert, bis alle Threads oder Prozessoren den angegebenen Punkt erreicht haben.

Wenn Sie sich auf Waitall beziehen, müssen Sie eine Reihe von WaitHandles beibehalten. In diesem Sinne ist Barriere etwas einfacher zu bedienen. Ich stimme jedoch zu, dass die beiden Methoden bemerkenswert ähnlich aussehen.

Die Hauptschwächefunktion Waitall ist eine maximale Griffgrenze (nur 64 Griffe können verwendet werden) Problemumgehung für das WaitHandle.waitall 64 Handle Limit?

Scheint für mich ein gezählter Wartehandle zu sein. Gibt Ihnen die Bequemlichkeit, zu sagen: "Wenn die Anzahl der auf dieses Schloss wartenden Threads zu X wird, lassen Sie sie alle gehen." Es ist nichts, was man mit einem anderen Konstrukt nicht machen kann, aber es scheint bequem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top