Was ist eine race condition?
Beim schreiben von multi-threaded-Anwendungen, eine der am meisten common Probleme sind race conditions.
Meine Fragen an die community:
Was ist eine race condition? Wie spürt man Sie? Wie gehst du mit Ihnen? Schließlich, wie wollen Sie verhindern, dass Sie auftreten?
InformationsquelleAutor der Frage bmurphy1976 | 2008-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer race-Bedingung tritt auf, wenn zwei oder mehr threads können auf gemeinsame Daten zugreifen und Sie versuchen, es zu ändern bei der gleichen Zeit. Da der thread-scheduling-Algorithmus kann wechseln zwischen threads zu jeder Zeit, Sie wissen nicht, in welcher Reihenfolge die threads versuchen, Zugriff auf die freigegebenen Daten. Deshalb ist das Ergebnis der änderung der Daten ist abhängig von der thread-scheduling-Algorithmus, d.h. die beiden threads "racing" - Zugang/änderung der Daten.
Probleme oft auftreten, wenn ein thread ein "check-then-act" (z.B. "check", ob der Wert X ist, dann "handeln", etwas zu tun, das kommt auf den Wert X) und einem anderen thread etwas tut, um den Wert zwischen "check" und "act". E. g:
Den Punkt -, y -, könnten 10 sein, oder es könnte alles sein, je nachdem, ob einem anderen thread geändert x zwischen check und act. Sie haben keine wirkliche Möglichkeit zu wissen.
Um zu verhindern, dass race-conditions auftreten, würden Sie in der Regel setzen Sie eine Sperre um die freigegebenen Daten zu gewährleisten, kann nur ein thread Zugriff auf die Daten zu einem Zeitpunkt. Dies würde bedeuten, so etwas wie dieses:
InformationsquelleAutor der Antwort Lehane
Einer "race condition" besteht, wenn Multithreading (oder eine andere parallel -) code, der auf eine freigegebene Ressource zugreifen könnten, tun dies in einer Weise zu unerwarteten Ergebnissen führen.
Nehmen Sie dieses Beispiel:
Wenn Sie hatte 5 threads ausführen dieses Codes auf einmal, der Wert von x WÜRDE NICHT am Ende wird 50,000,000. Es wäre in der Tat unterscheiden sich mit jedem Lauf.
Dies ist da, um für jeden thread, erhöht sich der Wert von x, haben Sie Folgendes zu tun: (vereinfacht natürlich),
Jedem thread in jedem Schritt in diesem Prozess zu jeder Zeit, und Sie können Schritt für Schritt auf einander, wenn einer freigegebenen Ressource beteiligt ist. Der Zustand von x verändert werden kann, durch einen anderen thread in der Zeit zwischen x gelesen wird und wenn es geschrieben ist, zurück.
Angenommen ein thread ruft den Wert von x, aber noch nicht gespeichert ist es noch nicht. Ein anderer thread kann auch wieder die gleiche Wert von x (weil kein Gewinde geändert hat es noch) und dann würden Sie beide speichern die gleiche - Wert (x+1) x!
Beispiel:
Race conditions vermieden werden können durch den Einsatz von irgendeiner Art von Verschluss - Mechanismus, bevor der code für den Zugriff auf die freigegebene Ressource:
Hier, die Antwort kommt wie von 50.000.000 jeder Zeit.
Mehr zu sperren, Suche nach: mutex, semaphore, critical section, gemeinsam genutzte Ressource.
InformationsquelleAutor der Antwort privatehuff
Sie planen, zu gehen, um einen Film auf 5 Uhr. Erfragen Sie die Verfügbarkeit der tickets, die um 4 Uhr. Der Vertreter sagt, dass Sie verfügbar sind. Entspannen Sie sich und erreichen das ticket-Fenster 5 Minuten vor der show. Ich bin sicher, Sie können erraten, was passiert: das Haus ist voll. Das problem hier war die Dauer zwischen dem Scheck und der Aktion. Sie erkundigte sich bei 4 und fungierte bei 5. In der Zwischenzeit jemand anderes packte den tickets. Das ist ein race-condition - speziell für die "prüfen-dann-handeln" - Szenario von race conditions.
Religiösen code-review, multi-threaded unit-tests. Es gibt keine Abkürzung. Es gibt einige Eclipse-Plug-in Schwellenländern, aber auch nichts stabil aber.
Das beste, was wäre zu schaffen, nebenwirkungsfreie und zustandslose Funktionen, verwenden immutables so viel wie möglich. Aber das ist nicht immer möglich. Also mit java.util.gleichzeitige.Atomare, parallele Datenstrukturen, die die ordnungsgemäße Synchronisierung und Schauspieler basiert Parallelität helfen.
Die beste Ressource für die Parallelität ist JCIP. Sie können auch einige mehr details zur oben genannten Erklärung hier.
InformationsquelleAutor der Antwort Vishal Shukla
Gibt es einen wichtigen technischen Unterschied zwischen race-conditions und data races. Die meisten Antworten scheinen, um die Annahme, dass diese Begriffe gleichbedeutend sind, aber Sie sind es nicht.
Einem data race tritt auf, wenn 2 Hinweise auf den gleichen Speicherplatz von mindestens einer dieser Zugänge ist ein schreiben und es ist keine passiert, bevor Sie bestellen unter diesen zugreift. Nun was ist passiert, bevor die Bestellung ist Gegenstand vieler Debatten, aber im Allgemeinen ulock-lock-Paare auf dem gleichen lock-variable und warten-signal-Paare auf die gleiche bedingungsvariable induzieren passiert-vor der Bestellung.
Einer race condition ist ein semantischer Fehler. Es ist ein Fehler, der Auftritt, in den der Zeitpunkt oder die Reihenfolge der Ereignisse, führt zu falschen Programm Verhalten.
Viele race conditions werden können (und tatsächlich sind), verursacht durch die Daten Rennen, aber das ist nicht notwendig. Als eine Angelegenheit von der Tat, die Daten, die Rennen und Rennen Bedingungen sind weder die notwendige, noch die hinreichende Bedingung für einen anderen. Diese blog-post erklärt auch den Unterschied sehr gut, mit einer einfachen bank-Transaktion Beispiel. Hier ist ein weiteres einfaches Beispielerklärt den Unterschied.
Nun, dass wir nagelfest ist die Terminologie, lassen Sie uns versuchen, eine Antwort auf die ursprüngliche Frage.
Gegeben, dass race-conditions sind semantische Fehler, es gibt keinen Allgemeinen Weg, Sie zu erkennen. Dies ist, weil es keine Möglichkeit gibt, dass ein automatisiertes Orakel, das unterscheiden kann, richtige vs. falsche Verhalten des Programms in den Allgemeinen Fall. Rennen ist die Erkennung eines unentscheidbaren Problems.
Auf der anderen Seite Daten, die Rennen haben eine genaue definition, bezieht sich nicht unbedingt auf Richtigkeit, und daher kann man Sie entdeckt. Es gibt viele Varianten von Daten-race-Detektoren (statische/dynamische data-race-Erkennung, lockset-basierte data-race-Erkennung, passiert-bevor-basierten data race detection, hybrid-data-race-Erkennung). Ein state of the art dynamic data race detector ist ThreadSanitizer das funktioniert in der Praxis sehr gut.
Umgang mit Daten, die Rennen im Allgemeinen erfordert einige Programmier-Disziplin zu induzieren passiert-bevor die Kanten zwischen den Zugriffen auf gemeinsame Daten (während der Entwicklung, oder, sobald Sie erkannt werden mit den oben genannten tools). dies kann durch locks, condition Variablen, Semaphoren, etc.. Allerdings kann man sich auch beschäftigen verschiedene Programmier-Paradigmen, wie message passing (statt shared memory), die Daten vermeiden Rennen mit dem Bau.
InformationsquelleAutor der Antwort Baris Kasikci
Einer Art-von-kanonische definition ist "wenn zwei threads auf den gleichen Speicherort im Speicher in der gleichen Zeit, und mindestens einer der Eingänge ist ein schreiben." In der situation der "reader" - thread bekommen kann, wird der alte Wert oder der neue Wert, je nachdem, welcher thread "das Rennen gewinnt." Dies ist nicht immer ein bug—in der Tat, einige wirklich haarige low-level-algorithmen tun dies absichtlich—aber es sollte im Allgemeinen vermieden werden. @Steve Gury geben ein gutes Beispiel dafür, wenn es könnte ein problem sein.
InformationsquelleAutor der Antwort Chris Conway
Einer race condition ist eine Art bug, das passiert nur mit bestimmten zeitlichen Bedingungen.
Beispiel:
Stellen Sie sich vor Sie haben zwei threads A und B.
In Thread A:
In Thread B:
Wenn Ein thread präemptiv unterbrochen wird, nachdem Sie gerade prüfen, das Objekt.einen nicht null ist, wird B tun
a = 0
und wenn der thread Eine wird gewinnen, der Prozessor, es wird eine "Division durch null".Dieser Fehler nur passieren, wenn Ein thread präemptiv unterbrochen wird nur nach der if-Anweisung, es ist sehr selten, aber es kann passieren.
InformationsquelleAutor der Antwort Steve Gury
Race conditions auftreten in multi-threaded-Anwendungen oder multi-Prozess-Systeme. Eine race-condition, an seinem grundlegendsten, ist alles, dass macht die Annahme, dass zwei Dinge nicht in den gleichen thread oder Prozess wird passieren, in einer bestimmten Reihenfolge, ohne Schritte, um sicherzustellen, dass Sie tun. Dies geschieht Häufig, wenn zwei threads auf der Durchreise sind Nachrichten, die durch Einstellung und überprüfung der member-Variablen einer Klasse beide zugreifen können. Es gibt fast immer eine race-Bedingung, wenn ein thread Aufrufe schlafen, zu geben einem anderen thread der Zeit, eine Aufgabe zu beenden (es sei denn, dass der Schlaf in einer Schleife mit einigen Mechanismus).
Tools zur Verhinderung von race conditions sind abhängig von der Sprache und OS, aber einige gemeinsamen diejenigen sind, mutexes, critical sections, und Signale. Mutexe sind gut, wenn Sie wollen, stellen Sie sicher, dass Sie der einzige sind, etwas zu tun. Signale sind gut, wenn Sie wollen, stellen Sie sicher, dass jemand beendet hat, etwas zu tun. Minimierung der freigegebenen Ressourcen kann auch helfen, zu verhindern, dass unerwartete Verhaltensweisen
Erkennung von race-conditions kann schwierig sein, aber es gibt ein paar Anzeichen. Code, die stützt sich stark auf schläft ist anfällig für race conditions, so prüfen Sie, ob Aufrufe von sleep-in den betroffenen code. Hinzufügen besonders lange schläft, kann auch für das debugging verwendet werden, um zu versuchen und zu zwingen eine bestimmte Reihenfolge der Ereignisse. Dies kann nützlich sein, für das reproduzieren des Verhaltens, zu sehen, wenn Sie machen können Sie verschwinden, indem Sie ändern das timing der Dinge, und für die Test-Lösungen setzen. Der schläft sollte entfernt werden, nachdem Debuggen.
Die Signatur Zeichen, dass man eine Rasse hat, Bedingung ist jedoch, wenn es gibt ein Problem, das tritt nur zeitweise auf einigen Maschinen. Häufige Fehler wäre, Abstürzen und deadlocks. Mit der Protokollierung, Sie sollten in der Lage sein zu finden, den betroffenen Bereich und arbeiten von dort zurück.
InformationsquelleAutor der Antwort tsellon
Race-condition ist nicht nur im Zusammenhang mit der software, aber auch im Zusammenhang mit der hardware zu. Eigentlich ist die Bezeichnung war zunächst geprägt von der hardware-Industrie.
Laut wikipedia:
Software-Industrie nahm diesen Begriff ohne änderung, das macht es ein wenig schwierig zu verstehen.
Müssen Sie einige Ersatz-zuordnen der software-Welt:
Also "race condition" in software-Branche bedeutet "zwei " threads"/"zwei Prozesse" - Rennen sich gegenseitig um "Einfluss auf einen freigegebenen Zustand", und das endgültige Ergebnis der freigegebene Status wird davon abhängen, einige subtile zeitliche Differenz, die hervorgerufenen werden konnte durch einige bestimmten thread/Prozess starten, um die thread - /Prozess-scheduling, etc.
InformationsquelleAutor der Antwort nybon
Microsoft veröffentlichte einen wirklich ausführlichen Artikel in dieser Angelegenheit von race-conditions und deadlocks. Die meisten zusammengefasst Abstrakt aus, es wäre der Titel Absatz:
InformationsquelleAutor der Antwort Konstantin Dinev
Einer race condition ist eine situation, auf concurrent programming, wo zwei gleichzeitige threads oder Prozessen und der daraus resultierende Endzustand hängt davon ab, wer bekommt die Ressource zuerst.
InformationsquelleAutor der Antwort Jorge Córdoba
Einer race-condition ist eine unerwünschte situation, die Auftritt, wenn ein Gerät oder system versucht, zwei oder mehr Vorgänge gleichzeitig, aber wegen der Art des Gerätes oder Systems, die Operationen getan werden muss, in der richtigen Reihenfolge, um richtig gemacht werden.
In der computer-Speicher oder eine race-Bedingung kann auftreten, wenn Befehle zum Lesen und schreiben eine große Menge von Daten empfangen werden, fast im gleichen Augenblick, und die Maschine versucht zu überschreiben einige oder alle alte Daten, während die alten Daten noch gelesen werden. Das Ergebnis kann eine oder mehrere der folgenden: ein computer-crash, eine "illegale operation" Meldung und Abschaltung des Programms, Fehler beim Lesen der alten Daten, oder Fehler schreiben der neuen Daten.
InformationsquelleAutor der Antwort dilbag koundal
Hier ist das klassische Bankkonto Beispiel, die helfen Neulinge verstehen, Threads in Java leicht w.r.t. race conditions:
InformationsquelleAutor der Antwort realPK
Ok das ist 4 Fragen. eins nach dem anderen Antwort ist so unter....
Es tritt auf, wenn die Ausgabe und/oder Ergebnis des Prozesses ist entscheidend von der Reihenfolge bzw. den Zeitpunkt, an anderen Veranstaltungen, also z.B. 2 Signale racing zu ändern, zuerst den output.
Führt es zu Fehler, die schwer zu lokalisieren.
Verwenden Sie Semaphoren
Und schließlich
Einen Weg, um race-Bedingung ist mit locking-Mechanismus für Ressourcen. aber das sperren von Ressourcen kann zu einem Deadlock führen. die muss behandelt werden.
InformationsquelleAutor der Antwort Adnan Qureshi
Versuchen, dieses grundlegende Beispiel für ein besseres Verständnis von race-Bedingung:
InformationsquelleAutor der Antwort Morsu
Will man ja nicht immer zu verwerfen, eine race-condition. Wenn Sie haben eine fahne, die gelesen und geschrieben werden können, indem mehrere threads, und dieses flag wird auf 'done' von einem thread, so dass andere thread-Verarbeitung beendet wird, wenn die flag gesetzt ist, 'fertig', Sie wollen nicht, dass die "race-condition" beseitigt werden. In der Tat, dieser kann bezeichnet werden als eine gutartige race-Bedingung.
Jedoch mit einem tool für die Erkennung von race-Bedingung, es wird entdeckt, wie schädlich race-Bedingung.
Weitere details zu race-condition hier, http://msdn.microsoft.com/en-us/magazine/cc546569.aspx.
InformationsquelleAutor der Antwort octoback
Überlegen, eine operation, die anzeigen zu zählen, sobald die Anzahl wird inkrementiert. dh., sobald CounterThread inkrementiert den Wert DisplayThread muss, um die Anzeige der zuletzt aktualisierte Wert.
Ausgabe
Hier CounterThread wird das Schloss Häufig und aktualisiert den Wert vor DisplayThread zeigt es. Hier existiert eine Race-condition. Race-Bedingung kann gelöst werden durch die Verwendung Synchronzation
InformationsquelleAutor der Antwort bharanitharan
Können Sie verhindern race-conditionwenn Sie "Atomic" - Klassen. Der Grund ist einfach der thread nicht getrennt operation get-und set-Beispiel ist unter:
Als Ergebnis, werden Sie haben 7 in-link "ai".
Obwohl du hast zwei Aktionen, aber da die beiden den Betrieb bestätigen den thread und nicht ein thread stört, dass bedeutet, dass keine race-conditions!
InformationsquelleAutor der Antwort Aleksei Moshkov