1328 Stimmen

Was ist eine Rennbedingung?

Beim Schreiben von Multithreading-Anwendungen ist eines der häufigsten Probleme die Race Condition.

Meine Fragen an die Gemeinschaft lauten:

  • Was ist die Rennbedingung?
  • Wie kann man sie erkennen?
  • Wie gehen Sie mit ihnen um?
  • Und schließlich: Wie kann man verhindern, dass sie auftreten?

10 Stimmen

Ich möchte darauf hinweisen, dass - ohne Angabe der Sprache - die meisten Teile dieser Frage nicht richtig beantwortet werden können, da die Definition, die Folgen und die Instrumente zu ihrer Verhinderung in den verschiedenen Sprachen unterschiedlich sein können.

0 Stimmen

@MikeMB. Einverstanden, außer bei der Analyse der Ausführung von Bytecode, wie sie von Race Catcher durchgeführt wird (siehe diesen Thread stackoverflow.com/a/29361427/1363844 ) können wir all die etwa 62 Sprachen ansprechen, die sich zu Bytecode kompilieren lassen (siehe de.wikipedia.org/wiki/Liste_der_JVM_Sprachen )

12voto

Adnan Qureshi Punkte 526

Was ist eine Rennbedingung?

Die Situation, in der ein Prozess entscheidend von der Reihenfolge oder dem Zeitpunkt anderer Ereignisse abhängt.

Zum Beispiel, Prozessor A und Prozessor B beide Bedürfnisse identische Ressourcen für ihre Ausführung.

Wie kann man sie erkennen?

Es gibt Tools zur automatischen Erkennung von Race Conditions:

Wie gehen Sie mit ihnen um?

Race Condition kann behandelt werden durch Mutex o Semaphoren . Sie fungieren als eine Sperre, die es einem Prozess ermöglicht, eine Ressource auf der Grundlage bestimmter Anforderungen zu erwerben, um Wettlaufbedingungen zu verhindern.

Wie kann man sie verhindern?

Es gibt verschiedene Möglichkeiten, Wettlaufbedingungen zu verhindern, z. B. Vermeidung von kritischen Abschnitten .

  1. Keine zwei Prozesse liegen gleichzeitig in ihren kritischen Regionen. ( Gegenseitiger Ausschluss)
  2. Es werden keine Annahmen über Geschwindigkeiten oder die Anzahl der CPUs gemacht.
  3. Kein Prozess, der außerhalb seines kritischen Bereichs läuft und andere Prozesse blockiert.
  4. Kein Prozess muss ewig warten, bis er in seinen kritischen Bereich eintritt. (A wartet auf B Ressourcen, B wartet auf C Ressourcen, C wartet auf A Ressourcen)

4voto

dilbag koundal Punkte 89

Eine Wettlaufbedingung ist eine unerwünschte Situation, die auftritt, wenn ein Gerät oder System versucht, zwei oder mehr Vorgänge gleichzeitig auszuführen, aber aufgrund der Beschaffenheit des Geräts oder Systems müssen die Vorgänge in der richtigen Reihenfolge ausgeführt werden, um korrekt ausgeführt zu werden.

In Computerspeichern kann eine Wettlaufbedingung auftreten, wenn Befehle zum Lesen und Schreiben einer großen Datenmenge fast zur gleichen Zeit eingehen und der Computer versucht, einige oder alle alten Daten zu überschreiben, während diese alten Daten noch gelesen werden. Das Ergebnis kann eines oder mehrere der folgenden sein: ein Computerabsturz, eine "illegale Operation", eine Meldung und das Herunterfahren des Programms, Fehler beim Lesen der alten Daten oder Fehler beim Schreiben der neuen Daten.

3voto

Aleksei Moshkov Punkte 91

Sie können Race Condition verhindern wenn Sie "Atomic"-Klassen verwenden. Der Grund dafür ist, dass der Thread die Operationen "Get" und "Set" nicht voneinander trennt (siehe Beispiel unten):

AtomicInteger ai = new AtomicInteger(2);
ai.getAndAdd(5);

Als Ergebnis haben Sie 7 in Link "ai". Obwohl Sie zwei Aktionen durchgeführt haben, bestätigen beide Operationen denselben Thread und kein anderer Thread wird sich einmischen, d.h. keine Race Conditions!

0voto

rashedcs Punkte 3145

Eine Race Condition ist eine unerwünschte Situation, die auftritt, wenn zwei oder mehr Prozesse gleichzeitig auf gemeinsame Daten zugreifen und diese ändern können, weil es konkurrierende Zugriffe auf eine Ressource gibt. Ein Problem im kritischen Abschnitt kann eine Race Condition verursachen. Um kritische Bedingungen zwischen den Prozessen zu lösen, müssen wir jeweils nur einen Prozess herausnehmen, der den kritischen Abschnitt ausführt.

0voto

bharanitharan Punkte 2389

Betrachten wir einen Vorgang, bei dem der Zählerstand angezeigt werden muss, sobald er erhöht wird, d. h. sobald Gegenläufiger Faden erhöht den Wert DisplayThread muss den zuletzt aktualisierten Wert anzeigen.

int i = 0;

Ausgabe

CounterThread -> i = 1  
DisplayThread -> i = 1  
CounterThread -> i = 2  
CounterThread -> i = 3  
CounterThread -> i = 4  
DisplayThread -> i = 4

Hier Gegenläufiger Faden erhält die Sperre häufig und aktualisiert den Wert, bevor DisplayThread zeigt es an. Hier liegt eine Race Condition vor. Race Condition kann durch Synchronisation gelöst werden

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