Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
22.07.2008, 15:15 (Dieser Beitrag wurde zuletzt bearbeitet: 22.07.2008 15:15 von eg.)
Na ja, ganz einfach. Bis jetzt war es nur ein Beispiel. Wenn ich aber in der oberen Schleife eine Schnittstelle auslese (z.B. RS232) und da kommen die Daten sehr selten, z.B. jede 10 Sekunden ein Datum. Dann wird dieser Flag nur jede 10 Sekunden updatet. Was macht aber die untere Schleife, die frisst die ganze CPU weg.
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Race Conditions
Wieso denn? Du kannst doch im "False"-Case eine kleine Zeitverzögerung reinbauen.
Gruß Markus
' schrieb:Na ja, ganz einfach. Bis jetzt war es nur ein Beispiel. Wenn ich aber in der oberen Schleife eine Schnittstelle auslese (z.B. RS232) und da kommen die Daten sehr selten, z.B. jede 10 Sekunden ein Datum. Dann wird dieser Flag nur jede 10 Sekunden updatet. Was macht aber die untere Schleife, die frisst die ganze CPU weg.
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
23.07.2008, 08:06 (Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2008 08:13 von IchSelbst.)
Ich hab mir mal eure Beispiele angesehen. Die sind aber nur dazu geeignet, ganz bestimmte Race Conditions zu vermeiden. So Sachen, die in Richtung Ablaufsteuerung gehen. Oder sehe ich da was falsch?
Unter Race Condition würde ich jetzt zuerst solche Sachen verstehen, wie hier bei WikiPedia beschrieben. Also z.B. das Manipulieren einer Variablen von zwei unabhängigen (While-)Tasks. Wobei die zu schützende Operation natürlich nicht nur ein Increment sein kann. Ich denke da eher an ganze Array-Operationen.
Nachtrag:
Da hängt ja ganz oben das Beispiel. Allerdings: Dieses Beispiel würde ich nicht unter Race Condition fallen lassen. So wie das Beispiel ist, kann da nämlich nichts falsch werden. Da hinkt halt die Anzeige hinterher. Was im übrigen auch beim DaqMX-Task-Auslesen so ist. Da wird ja auch nur im Raster ausgelesen, sodass die gerade bearbeiteten Daten den tatsächlichen hinterher sind.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Ja, stimme ich zu. Es ist nur eine Art von Race Conditions. Es gibt auch viel mehr Beispiele, wo diese auftreten können. Ich habe nun mein erstes Beispiel als bestes gefunden, das das Verhalten verständlich darstellt.
Falls jemand andere schöne Beispiele hat, bitte hier posten. Ich werde die aufsammeln und ein Tutorial dazu schreiben.
Wie gesagt, um Race Conditions zu vermeiden, nimmt man Tools aus der Synchronisationspalette. Semaphoren(wie bei Wikipedia vorgeschlagen) gehören allerdings auch dazu.
' schrieb:Falls jemand andere schöne Beispiele hat, bitte hier posten.
Ich hab - leider - keine Beispiele.
Zitat:Wie gesagt, um Race Conditions zu vermeiden, nimmt man Tools aus der Synchronisationspalette.
Ja. Wenn dann so (müsste ich aber erst ankucken). Mit Variablen sowas selbst machen zu wollen, geht per se nicht. Dazu ist die Umgebung nicht geeignet. Lediglich spezielle Fälle wie solche von dir angesprochenen kann man verriegeln.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
25.08.2010, 08:30 (Dieser Beitrag wurde zuletzt bearbeitet: 25.08.2010 08:36 von deicebear.)
Schaut mal in mein PNG, was ich angehängt habe, ob die paar Variablen schon Race Conditions verursachen? Ich kenn das ja bnoch von Pascal FC oder von Microcontrollern, wenn ein Vorgang eine Variable beschreibt muss jeder weitere in eine Warteschleife bis eine Flanke zur Freigabe fällt, ich bin froh schon + und - mit LabVIEW hinzubekommen ;-D mir graut es schon davor.
Können eigentlich Race Conditions Ursache dafür sein, dass sich mein LabVIEWlv85manchmal 15 Min. lang hängt, wenn ich den Stop-Button, nach einem Programmtest, drücke? Oder auch das meine Taktuhr nicht mehr unter 300ms geht, so ein ziehmlich langsamer Programmzyklus?
Danke schonmal:)finde man kann über Race Conditions nicht genug aufgeklärt werden :-D
' schrieb:da wir ja beim Thema Race Conditions sind, gibt es eine Auflistung aller Fälle, die ein solches Verursachen?
Ist mir nicht bekannt.
Zitat:Schaut mal in mein PNG, was ich angehängt habe, ob die paar Variablen schon Race Conditions verursachen?
Ich bin der Meinung, die Verwendung der Variablen "Array" führt nicht zu ReceConditions.
Zitat:Ich kenn das ja bnoch von Pascal FC oder von Microcontrollern, wenn ein Vorgang eine Variable beschreibt muss jeder weitere in eine Warteschleife bis eine Flanke zur Freigabe fällt,
"RaceCondition" ist eher als Prinzip zu verstehen - und ist deswegen Programmiersprachen unabhängig. Programmiersprachenabhängig ist lediglich die Wahrscheinlichkeit, eine RaceCondition zu programmieren, und die Möglichkeit, sie zu umgehen. In LV werden RaceConditions vermieden, indem man Drähte zieht anstelle lokale Variablen zu erstellen.
Zitat:Können eigentlich Race Conditions Ursache dafür sein, dass sich mein LabVIEWlv85manchmal 15 Min. lang hängt, wenn ich den Stop-Button, nach einem Programmtest, drücke?
Als Auswirkung einer Auswirkung einer RaceCondition ist so was möglich.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
25.08.2010, 11:01 (Dieser Beitrag wurde zuletzt bearbeitet: 25.08.2010 16:55 von Lucki.)
Man kann die Variablen in 2 Schleifen am einfachsten synchronisieren, wenn man die absolute Uhr verwendet.
Anslonsten würde ich aber sagen: Als Lehrbeispiel zum Thema Race Condition ist das VI ungklücklich gewählt und wenig hilfreich. Daß sich voneinander unabhängige, nicht synchronisierte Schleifen ihre jeweiligen Daten - ganz gleich ob sie aus der anderen Schleife kommen oder von was weiß ich woher - immer erst bei ihren jeweiligen neuen Schleifendurchlauf aktualisieren, ist doch selbstverständlich und hat mit Wettlaufeffekten nun wirklich nichts zu tun. Der Witz an guten Beispielen zum Thems Wettlauferscheinungen ist doch, daß etwas Undefiniertes oder für den Anfänger Überraschendes passiert. Das ist hier überhaupt nicht der Fall.
' schrieb:Jaja, lokale Variablen..., die halten sich nicht an den Datenfluss. Und wenn etwas weiter rechts im Blockdiagramm steht, dann wird das noch lange nicht später ausgeführt als der Code weiter links im BD.
Das war ein schöner RaceCondotions-Thread wo ein trotteliger Anfänger seine Überraschung erlebt hat
„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
25.08.2010, 14:10 (Dieser Beitrag wurde zuletzt bearbeitet: 25.08.2010 14:10 von deicebear.)
Gibt es einen Weg festzulegen, in welcher Reihenfolge was abgearbeitet wird? Zum Beispiel in einer While-Schleife habe ich 3 Cases und 3 For Schleifen und ich lege fest, pro Zyklus soll erst Case 1, dann 2, dann 3 folgen und dann ForSchleife 3, ForSchleife 2 und zum Schluss ForSchleife 1? So etwas ist wahrscheinlich nicht möglich, oder?