Regeln für die Suche nach / Vermeidung von gemeinsam genutzten Daten in einer Multithread-Anwendung

StackOverflow https://stackoverflow.com/questions/618216

  •  03-07-2019
  •  | 
  •  

Frage

Hy,

Wie wir alle wissen, eine Multithreading-Anwendung entwickelt, ist eine harte Sache. Vor allem der Punkt, wenn und was zu verriegeln nicht so offensichtlich IMHO. Ich suche oft bei einer Methode / Klasse und ich muss mich fragen, ob ich ein paar Daten gemeinsam nutzen, die von mehreren Threads kann geändert werden. Und wenn ich nicht sicher bin, es endet in einem Schloss () über einen gesamten Codeblock.

Also, was Ich mag wissen: Haben Sie Anregungen für Muster / Regeln usw. müssen gemeinsam genutzte Daten zu identifizieren? Oder Techniken, um sicherzustellen, dass Ihr Code ist Thread-sicher.

Z. B:.

  • Statische Methoden sollten nicht Klassenfelder ändern. (Es sei denn, sie das Feld zu sperren.)
  • Referenz type'd Parameter einer Methode soll nicht „direkt“ übergeben werden. Geben Sie stets einen Klon.

Übrigens:

Microsoft Research arbeitet an CHESS . Ein Werkzeug für die Suche nach und Heisenbugs in Programme gleichzeitig wiedergegeben werden. Ich hoffe, dies und PLINQ wird die Entwicklung konkurrierender Programme machen verbessern.

War es hilfreich?

Lösung

Wo immer möglich, machen Sie Ihre Arten unveränderlich mit zu beginnen. Dann gibt es keine Notwendigkeit, zu klonen. Wenn Sie auf „Ändern“ müssen Sie den Inhalt eines Objekts, machen die Methode ein neues Objekt zurückgeben statt -. Wie String.Replace etc tut

Dies ist im Grunde der funktionale Programmierung Stil, und es ist sehr schön. Es ist bedauerlich, dass wir nicht (derzeit) haben unveränderlich Sammlungen in den .NET-Framework aufgebaut, althoughthere Dritt diejenigen sind um, darunter eine von unseren eigenen JaredPar .

Andere Tipps

Daten Einkapselung in einer Klasse nützlich ist, wenn es die Threadsicherheit zu machen. Sie erhalten Kontrolle darüber, wie die Daten zugegriffen wird, und Sie können die Klasse verantwortlich für die Synchronisierung machen, anstatt Code in der ganzen Anwendung mit versuchen, richtig zu synchronisieren.

Außerdem haben Sie irgendwo eine private Variable setzen, die Sie als Lock-Kennung verwenden können, so dass Sie vermeiden können, die Daten selbst als Kennung für das Schloss verwendet wird. Indem Sie eine private Variable gewidmet als Sperrenidentifizierer eine mögliche Quelle von Deadlocks entfernen.

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