Frage

In der Anwendung Ich schreibe, ich brauche eine Menge Basistypen zu schreiben, die höchstwahrscheinlich unveränderlich sein werden. Aber ich frage mich, wie wandelbar Typen parallel Anwendungen unveränderlich diejenigen vergleichen.

Sie können Schlösser mit veränderbaren Objekten verwenden, nicht wahr? Wie funktioniert es mit anderen Techniken zu vergleichen, mit unveränderlichen Typen in parallelen Anwendungen verwendet?

Sie sind zumindest weg Schlösser mit unveränderlichen Typen verwenden, nicht wahr?

War es hilfreich?

Lösung

Typen

  • Verwenden Sie unveränderliche Typen so viel wie möglich.
  • Verwenden Sie Thread-sichere Sammlungen statt explizite Sperren so viel wie möglich.
  • Nur änderbare Typen verwenden, wenn Sie keine andere vernünftige Wahl haben.

Themen

  • Verwenden Sie Thread-Pools so viel wie möglich.
  • Verwenden Sie Endlosschleifen, wenn Thread-Pools sind nicht möglich.
  • manuell starten und Threads als letztes Mittel stoppen.

Wenn Sie über explizite Sperren verwenden, dokumentieren sie gründlich. Vor allem, wenn es darum geht, die Reihenfolge, in der Objekte sperren. Wenn Sie wissen, dass Foo Objekte vor Bar Objekte immer gesperrt sind und dass Foo (Taste 100) immer vor Foo gesperrt ist (key = 200), werden Sie nicht Deadlocks erhalten.

Andere Tipps

Der Schlüssel parallelizable Anwendungen zu schreiben, ist zu bleiben weg von wandelbaren gemeinsamen Staat. Sharing veränderbare Zustand zwischen Threads erfordert Synchronisation, die typischerweise eine gewisse Form von Verriegelungs bringt. kann unveränderliche Typen mit dazu beitragen, dass Sie nicht versehentlich Zustand teilen werden, indem es unmöglich macht, den Zustand der Objekte zu ändern. Dies ist jedoch kein Wundermittel, sondern nur eine Design-Wahl. Wenn der Algorithmus Sie parallelisieren versuchen, auf freigegebenen Zustand erfordert, werden Sie müssen eine Art Synchronisation erstellen.

Mutability wirkt sich nicht sperren.

Wenn Sie änderbare Typen verwenden Sie selbst aussetzt Schreibennach-Lese- oder Schreib-After-Write-Fehler. Dies sind Synchronisationsfehler im Zusammenhang mit der Aktualisierung von Wert, während andere Threads gleichzeitig zu lesen oder den Wert zu aktualisieren.

Um Synchronisierungsfehler zu verhindern, müssen Sie irgendeine Form der Verwendung des Verriegelungsmechanismus. Wenn Sie explizite Sperren tun verwenden müssen Sie erwerben Schlösser sehr vorsichtig über die Ordnung sein. Wenn Sie nicht vorsichtig sind, können Sie Deadlocks vorstellen. Zum Beispiel: Thread einer Sperre X erwirbt, dann Gewinde B Sperre Y. A erfaßt, während später Anfragen Gewindeverschluss Y und Thread B Anfragen sperren X. beiden Threads für Sperren auf unbestimmte Zeit warten Dies verursacht, die nie freigegeben werden

.

Zwei gute Faustregeln für die Verriegelung:

  • Erwerb Schlösser in einer bestimmten Reihenfolge (zum Beispiel immer erwerben Lock X vor Lock-Y)
  • Halten Schlösser für so kurze Zeit wie möglich. Erwerben Sie sie, wenn Sie sie brauchen, und lassen Sie sie, sobald Sie mit dem fertig sind.

Wenn Sie noch nie auf ein Objekt nach seiner Erstellung schreiben, brauchen Sie nicht, es zu sperren, bevor sie zugreifen. So werden Sie nicht unveränderliche Objekte sperren müssen.

Mit unveränderlichen Typen, wenn Sie können. Verwenden Sie änderbare Typen, wenn Sie zu haben (Serialisierung usw.).

Verwenden System.Threading.Tasks für alle Parallelisierung -. Aufgaben werden auch 5 mit der Sprache in C # bauen in, wenn async und warten auf Schlüsselwörter hinzugefügt werden

Ich schrieb einen Artikel über änderbare / unveränderliche Typen in C #: http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-immutable-in-a-parallel-world/

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