162 Stimmen

Was bedeutet "threadsicher"?

Kürzlich habe ich versucht, von einem anderen Thread (als dem UI-Thread) auf ein Textfeld zuzugreifen, und es wurde eine Ausnahme ausgelöst. Es sagte etwas über den "Code nicht Thread sicher" und so endete ich schriftlich einen Delegaten (Beispiel aus MSDN half) und rufen Sie es stattdessen.

Aber selbst dann habe ich nicht ganz verstanden, warum der ganze zusätzliche Code notwendig war.

Aktualisieren: Werde ich auf ernsthafte Probleme stoßen, wenn ich die

Controls.CheckForIllegalCrossThread..blah =true

5 Stimmen

Normalerweise bedeutet "thread safe", was immer die Person, die den Begriff verwendet, denkt, dass es bedeutet, zumindest für diese Person. Als solches ist es kein sehr nützliches Sprachkonstrukt - man muss viel, viel spezifischer sein, wenn man über das Verhalten von threaded Code spricht.

8 Stimmen

0 Stimmen

@dave Sorry, ich habe versucht zu suchen, aber aufgegeben...trotzdem danke...

7voto

Jacky Punkte 8111

Weitere Erläuterungen finden Sie in dem Buch "Java Concurrency in Practice":

Eine Klasse ist thread-sicher, wenn sie sich korrekt verhält, wenn auf sie von mehreren Threads aus zugegriffen wird, unabhängig von der Planung oder Verschachtelung der Ausführung dieser Threads durch die Laufzeitumgebung und ohne zusätzliche Synchronisierung oder andere Koordinierung seitens des aufrufenden Codes.

5voto

Chris Vest Punkte 8512

Ein Modul ist thread-sicher, wenn es garantiert, dass es seine Invarianten angesichts der Verwendung durch mehrere Threads und der Gleichzeitigkeit beibehalten kann.

Hier kann ein Modul eine Datenstruktur, eine Klasse, ein Objekt, eine Methode/Prozedur oder eine Funktion sein. Im Grunde ein Stück Code und zugehörige Daten mit einem bestimmten Umfang.

Die Garantie kann möglicherweise auf bestimmte Umgebungen wie eine bestimmte CPU-Architektur beschränkt sein, muss aber für diese Umgebungen gelten. Wenn es keine explizite Abgrenzung der Umgebungen gibt, wird in der Regel davon ausgegangen, dass sie für alle Umgebungen gilt, in denen der Code kompiliert und ausgeführt werden kann.

Thread-unsichere Module Mai bei Multithreading und gleichzeitiger Nutzung korrekt funktionieren, aber das ist oft mehr Glück und Zufall als sorgfältiges Design. Selbst wenn ein Modul bei Ihnen nicht kaputt geht, kann es kaputt gehen, wenn Sie es in eine andere Umgebung verschieben.

Multithreading-Fehler sind oft schwer zu beheben. Einige von ihnen treten nur gelegentlich auf, während andere aggressiv auftreten - auch dies kann umgebungsspezifisch sein. Sie können sich als subtil falsche Ergebnisse oder Deadlocks manifestieren. Sie können Datenstrukturen auf unvorhersehbare Weise durcheinander bringen und andere, scheinbar unmögliche Fehler in anderen, entfernten Teilen des Codes verursachen. Sie können sehr anwendungsspezifisch sein, so dass es schwer ist, eine allgemeine Beschreibung zu geben.

4voto

Ravindra babu Punkte 45577

Sicherheit der Gewinde : Ein thread-sicheres Programm schützt seine Daten vor Speicherkonsistenzfehlern. In einem Programm mit vielen Threads verursacht ein thread-sicheres Programm keine Nebeneffekte durch mehrere Lese-/Schreiboperationen von mehreren Threads auf dieselben Objekte. Verschiedene Threads können Objektdaten ohne Konsistenzfehler gemeinsam nutzen und ändern.

Sie können Thread-Sicherheit durch die Verwendung der erweiterten Gleichzeitigkeits-API erreichen. Diese Dokumentation Seite bietet gute Programmierkonstrukte zur Erreichung von Thread-Sicherheit.

Objekte sperren unterstützen Locking Idioms, die viele nebenläufige Anwendungen vereinfachen.

Testamentsvollstrecker definieren eine High-Level-API zum Starten und Verwalten von Threads. Executor-Implementierungen, die von java.util.concurrent bereitgestellt werden, bieten eine Thread-Pool-Verwaltung, die für umfangreiche Anwendungen geeignet ist.

Concurrent Collections erleichtern die Verwaltung großer Datensammlungen und können den Bedarf an Synchronisierung erheblich reduzieren.

Atomare Variablen haben Funktionen, die die Synchronisierung minimieren und helfen, Speicherkonsistenzfehler zu vermeiden.

ThreadLocalRandom (in JDK 7) ermöglicht die effiziente Erzeugung von Pseudozufallszahlen aus mehreren Threads.

Siehe java.util.concurrent y java.util.concurrent.atomic Pakete auch für andere Programmierkonstrukte.

2voto

Hamza Belmellouki Punkte 2022

Bei der Erstellung von Thread-sicherem Code geht es vor allem um die Verwaltung des Zugriffs auf gemeinsam genutzte veränderliche Zustände. Wenn veränderbare Zustände veröffentlicht oder zwischen Threads geteilt werden, müssen sie synchronisiert werden, um Fehler wie Rennbedingungen y Speicherkonsistenzfehler .

Ich habe kürzlich einen Blog über Fadensicherheit . Sie können ihn lesen, um weitere Informationen zu erhalten.

1voto

David M Punkte 69725

Sie arbeiten eindeutig in einer WinForms-Umgebung. WinForms-Steuerelemente weisen eine Thread-Affinität auf, was bedeutet, dass der Thread, in dem sie erstellt werden, der einzige Thread ist, der für den Zugriff auf sie und ihre Aktualisierung verwendet werden kann. Deshalb finden Sie auf MSDN und anderswo Beispiele, die zeigen, wie Sie den Aufruf zurück auf den Hauptthread verlagern können.

Normale WinForms-Praxis ist es, einen einzigen Thread, die alle Ihre UI Arbeit gewidmet ist zu haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X