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...

166voto

Gregory Pakosz Punkte 66918

Eric Lippert hat einen schönen Blogbeitrag mit dem Titel Was ist das, was Sie "thread safe" nennen? über die Definition von Fadensicherheit, wie sie bei Wikipedia zu finden ist.

3 wichtige Dinge, die aus den Links hervorgehen:

"Ein Teil des Codes ist thread-sicher, wenn er korrekt funktioniert während gleichzeitigen Ausführung durch mehrere Threads korrekt funktioniert."

"Insbesondere muss es dem Bedarf an mehreren Threads gerecht werden, um auf dieselben gemeinsamen Daten zugreifen, "

" und die Notwendigkeit, dass ein gemeinsam genutzter Teil der Daten nur von einer einzigen Person eingesehen werden kann Thread zu einem bestimmten Zeitpunkt zugreifen kann."

Auf jeden Fall eine Lektüre wert!

146voto

Vincent Ramdhanie Punkte 100426

Vereinfacht ausgedrückt bedeutet "threadsafe", dass der Zugriff von mehreren Threads aus sicher ist. Wenn Sie mehrere Threads in einem Programm verwenden und jeder von ihnen versucht, auf eine gemeinsame Datenstruktur oder einen Speicherplatz zuzugreifen, können verschiedene unangenehme Dinge passieren. Deshalb fügt man zusätzlichen Code hinzu, um diese Probleme zu verhindern. Wenn z. B. zwei Personen gleichzeitig an demselben Dokument schreiben, überschreibt die zweite Person, die speichert, die Arbeit der ersten Person. Um den Thread sicher zu machen, müssen Sie Person 2 zwingen zu warten, bis Person 1 ihre Aufgabe beendet hat, bevor sie Person 2 erlaubt, das Dokument zu bearbeiten.

23voto

ChrisF Punkte 130622

Wikipedia hat einen Artikel zum Thema Fadensicherheit.

Ce site Definitionsseite (Sie müssen eine Anzeige überspringen - Entschuldigung) definiert es so:

In der Computerprogrammierung beschreibt der Begriff "thread-safe" einen Programmteil oder eine Routine, die von mehreren Programmier-Threads aus aufgerufen werden kann, ohne dass es zu unerwünschten Wechselwirkungen zwischen den Threads kommt.

Ein Thread ist ein Ausführungspfad eines Programms. Ein Programm mit nur einem Thread hat nur einen Thread, so dass dieses Problem nicht auftritt. Praktisch alle GUI-Programme haben mehrere Ausführungspfade und damit Threads - es gibt mindestens zwei, einen für die Verarbeitung der Anzeige der GUI und die Übergabe von Benutzereingaben und mindestens einen weiteren für die eigentliche Ausführung der Programmoperationen.

Dadurch wird sichergestellt, dass die Benutzeroberfläche auch während der Arbeit des Programms ansprechbar ist, indem lang laufende Prozesse auf andere Threads als die Benutzeroberfläche verlagert werden. Diese Threads können einmal erstellt werden und für die gesamte Lebensdauer des Programms bestehen, oder sie werden nur bei Bedarf erstellt und zerstört, wenn sie beendet sind.

Da diese Threads oft gemeinsame Aktionen durchführen müssen - Festplatten-Eingaben, Ausgabe von Ergebnissen auf dem Bildschirm usw. - müssen diese Teile des Codes so geschrieben werden, dass sie von mehreren Threads, oft gleichzeitig, aufgerufen werden können. Dazu gehören Dinge wie:

  • Bearbeitung von Kopien von Daten
  • Hinzufügen von Sperren um den kritischen Code
  • Öffnen von Dateien im entsprechenden Modus - wenn Sie also lesen, öffnen Sie die Datei nicht auch zum Schreiben.
  • Bewältigung des Problems, dass der Zugriff auf Ressourcen nicht möglich ist, weil sie von anderen Threads/Prozessen gesperrt sind.

18voto

Sujith PS Punkte 4596

Einfach ausgedrückt bedeutet "thread-safe", dass eine Methode oder Klasseninstanz von mehreren Threads gleichzeitig verwendet werden kann, ohne dass Probleme auftreten.

Betrachten Sie die folgende Methode:

private int myInt = 0;
public int AddOne()
{
    int tmp = myInt;
    tmp = tmp + 1;
    myInt = tmp;
    return tmp;
}

Nun möchten sowohl Thread A als auch Thread B Folgendes ausführen AddOne() . aber A beginnt zuerst und liest den Wert von myInt (0) in tmp . Aus irgendeinem Grund beschließt der Scheduler nun, Thread A anzuhalten und die Ausführung auf Thread B zu verschieben. myInt (immer noch 0) in seine eigene Variable tmp. Thread B beendet die gesamte Methode, so dass am Ende myInt = 1 . Und 1 wird zurückgegeben. Jetzt ist wieder Thread A an der Reihe. Thread A macht weiter. Und addiert 1 zu tmp (tmp war 0 für Thread A). Und speichert dann diesen Wert in myInt . myInt ist wieder 1.

In diesem Fall wird also die Methode AddOne() wurde zwei Mal aufgerufen, aber da die Methode nicht thread-sicher implementiert wurde, wurde der Wert von myInt ist nicht 2, wie erwartet, sondern 1, weil der zweite Thread die Variable myInt bevor der erste Thread seine Aktualisierung beendet hat.

Die Erstellung von thread-sicheren Methoden ist in nicht-trivialen Fällen sehr schwierig. Und es gibt eine ganze Reihe von Techniken. In Java können Sie eine Methode markieren als synchronized bedeutet dies, dass nur ein Thread diese Methode zu einem bestimmten Zeitpunkt ausführen kann. Die anderen Threads warten in der Reihe. Dadurch wird eine Methode zwar thread-sicher, aber wenn in einer Methode viel Arbeit zu erledigen ist, wird dadurch viel Platz verschwendet. Eine andere Technik ist 'nur einen kleinen Teil einer Methode als synchronisiert markieren'. indem eine Sperre oder ein Semaphor angelegt und dieser kleine Teil (gewöhnlich der kritische Abschnitt genannt) gesperrt wird. Es gibt sogar einige Methoden, die als sperrfreie, thread-sichere Methoden implementiert sind, was bedeutet, dass sie so aufgebaut sind, dass mehrere Threads sie gleichzeitig durchlaufen können, ohne jemals Probleme zu verursachen; dies kann der Fall sein, wenn eine Methode nur einen atomaren Aufruf ausführt. Atomare Aufrufe sind Aufrufe, die nicht unterbrochen werden können und jeweils nur von einem Thread ausgeführt werden können.

13voto

Ein Beispiel aus der Praxis für den Laien ist

Nehmen wir an, Sie haben ein Bankkonto mit Internet- und Mobile-Banking und Ihr Konto hat nur 10 $. Sie überweisen Ihr Guthaben mit Mobile Banking auf ein anderes Konto, und in der Zwischenzeit kaufen Sie mit demselben Konto online ein. Wenn dieses Bankkonto nicht fadensicher ist, lässt die Bank zu, dass Sie zwei Transaktionen gleichzeitig durchführen, und dann ist die Bank bankrott.

Threadsafe bedeutet, dass sich der Zustand eines Objekts nicht ändert, wenn mehrere Threads gleichzeitig versuchen, auf das Objekt zuzugreifen.

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