Was macht eine Methode fadensicher? Wie lauten die Regeln?
Gibt es Allgemeine Regeln/Richtlinien für das, was macht eine Methode thread-sicher? Ich verstehe, dass es gibt wahrscheinlich eine million one-off-Situationen, aber was im Allgemeinen? Ist es so einfach?
- Wenn eine Methode greift nur auf lokale Variablen, es ist thread-sicher.
Ist es das? Gilt das auch für statische Methoden?
Einer Antwort, zur Verfügung gestellt von @Cybis, war:
Lokale Variablen können nicht geteilt werden threads, da jeder thread hat seinen eigenen stack.
Ist, dass der Fall für statische Methoden?
Wenn eine Methode übergeben wird eine Referenz-Objekt, bedeutet das, dass break thread-Sicherheit? Ich habe einige der Forschung getan, und es gibt eine Menge gibt, über bestimmte Fälle, aber ich hatte gehofft, in der Lage sein zu definieren, indem Sie nur ein paar Regeln, Richtlinien zu Folgen, um sicherzustellen, dass eine Methode ist thread-sicher.
So, ich denke, meine ultimative Frage ist: "gibt es eine kurze Liste von Regeln, die definieren, eine thread-sichere Methode? Wenn ja, was sind Sie?"
BEARBEITEN
Viele gute Punkte wurden hier gemacht. Ich denke, die wirkliche Antwort auf diese Frage ist: "Es gibt keine einfachen Regeln, um thread-Sicherheit gewährleisten." Cool. Fein. Aber im Allgemeinen ich denke, die akzeptierten Antworten bietet eine gute, kurze Zusammenfassung. Es gibt immer Ausnahmen. So soll es sein. Kann ich mit Leben.
InformationsquelleAutor der Frage Bob Horn | 2012-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn eine Methode (Instanz-oder statische) nur Verweise, Variablen Gültigkeitsbereich in dieser Methode dann es ist thread-sicher, da jeder thread hat seinen eigenen stack:
In diesem Fall mehrere threads nennen könnte
ThreadSafeMethod
gleichzeitig, ohne Frage.Dies ist auch der Fall, wenn die Methode ruft andere Methode der Klasse, die nur auf lokal begrenzten Gültigkeitsbereich von Variablen:
Wenn eine Methode greift auf alle (object state) Eigenschaften oder Felder (Instanz-oder statische) dann müssen Sie sperren, um sicherzustellen, dass die Werte nicht geändert werden, in einem anderen thread.
Sollten Sie sich bewusst sein, dass alle übergebenen Parameter in der Methode, die nicht entweder eine Struktur oder unveränderlich sein könnte, mutierte von einem anderen thread außerhalb des Anwendungsbereichs der Methode.
Zur Sicherstellung der richtigen Parallelität, die Sie benötigen, um sperren verwenden.
weitere Informationen finden Sie unter lock-Anweisung von C# - Referenz und ReadWriterLockSlim.
lock ist meistens hilfreich, um ein zu einer Zeit, Funktionalität
ReadWriterLockSlim
ist nützlich, wenn Sie mehrere Leser und einzelnen Autoren.InformationsquelleAutor der Antwort Trevor Pilley
Absolultely nicht. Sie können ein Programm schreiben mit nur einer einzigen lokalen Variablen zugegriffen, die von einem einzelnen thread das ist doch nicht threadsicher:
https://stackoverflow.com/a/8883117/88656
Absolut nicht.
Absolut nicht. Die Besonderheit einer lokalen Variablen ist, dass es nur sichtbar innerhalb des lokalen Bereichs, nicht, dass es zugeordnet, die in den temporären pool. Es ist völlig legal und möglich, auf die gleiche lokale variable aus zwei verschiedenen threads. Sie können dies tun, indem Sie anonyme Methoden, Lambda-Ausdrücke, iterator-Blöcke oder async-Methoden.
Absolut nicht.
Vielleicht.
Sind Sie gehen zu müssen, um zu lernen, mit Enttäuschung. Dies ist ein sehr schwieriges Thema.
NÖ. Als Sie sah, aus meinem Beispiel oben eine leere Methode nicht thread-safe. Genauso gut könnte man Fragen, "ist es eine kurze Liste der Regeln, die sicherstellt, dass eine Methode ist richtige". Nein, es ist nicht. Thread-Sicherheit ist nichts anderes als eine extrem komplizierte Art von Richtigkeit.
Darüber hinaus die Tatsache, dass Sie diese Frage stellen zeigt deine grundsätzliche Missverständnis um die thread-Sicherheit. Thread-Sicherheit ist ein globalen, nicht ein lokalen Eigenschaft eines Programms. Der Grund, warum es so schwer zu bekommen Recht, weil müssen Sie eine vollständige Kenntnis von threading-Verhalten des gesamten Programms, um sicherzustellen, seine Sicherheit.
Wieder, Sieh mein Beispiel: jede Methode ist trivial. Es ist die Art, die Methoden miteinander zu einem "globalen" Ebene, macht das Programm deadlock. Sie können nicht mit jeder Methode, und überprüfen Sie es aus, wie "sicher" und dann erwarten, dass das ganze Programm ist sicher, mehr, als Sie können feststellen, dass, weil Ihr Haus ist aus 100% nicht-hohl-Ziegel, das Haus ist auch nicht hohl. Die Hohlheit eines Hauses ist eine Globale Eigenschaft, die ganze Sache, nicht eine Summe der Eigenschaften seiner Teile.
InformationsquelleAutor der Antwort Eric Lippert
Gibt es keine harte und schnelle Regel.
Hier sind einige Regeln, um code thread-safe .NET, und warum diese nicht gut sind, Regeln:
lock
auf eine gemeinsame Sache. Alle sperren, die getan werden muss, in derselben Reihenfolge. Dadurch wird der code thread-safe ist, aber es wird unglaublich langsam, und Sie könnte genauso gut nicht von mehreren threads.Gibt es keine Regel, macht der code thread-safe, das einzige, was Sie tun können, ist stellen Sie sicher, dass Ihr code funktioniert, egal wie viele Male ist es aktiv ausgeführt, jeder thread kann an beliebiger Stelle unterbrochen, wobei jeder thread wird in den Zustand/Lage, und dies für jede Funktion (statisch oder anderweitig), die den Zugriff auf gemeinsame Objekte.
InformationsquelleAutor der Antwort earlNameless
Muss er synchronisiert werden, verwenden Sie ein Objekt sperren, Staatenlose oder unveränderlich.
link: http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html
InformationsquelleAutor der Antwort kasavbere