Not logged in. · Lost password · Register

ExarKun
Member since Oct 2013
278 posts
Subject: Klausur 24.07.2018 Aufgabe 3 Fehlersuche
Es gibt grade diskussion auf dem Pad:

Schreibtischlauf
volatile boolean[] finished;
execute() {...
   finished = new boolean[4];
...
  while(!finished[i]){...}
...}
run() {...
    finished[id] = true; // (id = i der for-Schleife bei der Threaderstellung).
}
Für mich ist das keine Wettlaufsituation, die explizit geschützt werden muss. da ja jeder Thread nur an die Ihm zugewiesen Position im Array schreibt.


Oder sehe ich hier was falsch?
Destranix
Erfahrener Webhelfer und Um-Rat-Frager
Member since Sep 2018
288 posts
+3 smixa, BobbyB, Orlan
Wenn ich mich recht entsinne, dann besteht das Problem darin, dass die einzelnen Arrayelemente nicht volatile sind und somit die while-Schleife möglicherweise endlos läuft.
I hate Forumssignaturen
ExarKun
Member since Oct 2013
278 posts
Das ist in der Grundlage korrekt, aber Endlos glaube ich jetzt irgendwie nicht, aber vielleicht eine Sekunde schneller, weil er eine

Ich habe den Code in IntelliJ getestet und ohne die while-schleife und mit einem Thread array realisiert und habe das selbe verhalten.
BobbyB
Member since Nov 2018
84 posts
Quote by Destranix:
Wenn ich mich recht entsinne, dann besteht das Problem darin, dass die einzelnen Arrayelemente nicht volatile sind und somit die while-Schleife möglicherweise endlos läuft.

Exakt. Nur das Array-Objekt selbst ist volatile.

Quote by ExarKun:
Das ist in der Grundlage korrekt, aber Endlos glaube ich jetzt irgendwie nicht, aber vielleicht eine Sekunde schneller, weil er eine

Ich glaube da fehlt noch ein Teilsatz, aber wir reden ja hier immer von THEORETISCHEN Folgen. Meistens wird es natuerlich funktionieren, aber garantiert ist es nicht.
Marcel[Inf]
#faui2k15, GTI-Tutor a. D.
Member since Nov 2015
618 posts
Weitere Informationen findest du via Google direkt unter "java volatile array."
ExarKun
Member since Oct 2013
278 posts
Die RaceCondition kann doch wenn dann nur zwischen Main und WorkerThreads entstehen. Die WorkerThreads untereinander kommen sich ja nicht ins Gehege, da ja jeder Thread an eine fixe Position schreiben muss und der main Thread liest ja nur den Wert aus, also im schlimmsten Fall (jetzt der fehlende Teilsatz) rotiert der main eine Sekunde mehr in seinem Thread.Sleep(1000).
Meines Erachtens ist das aber kein Fehler in der Programmbehandlung oder dem Ergebnis, sondern maximal ein "Performance" issue. wenn das aber als Fehler angesehen wird dann ja, wäre dass der Fehler und es müsste mit einem AtomicBoolean[] gearbeitet werden. ;)
Destranix
Erfahrener Webhelfer und Um-Rat-Frager
Member since Sep 2018
288 posts
Das problem ist, dass aus

while(!finished[i]){...}

durch den Compiler

boolean tmp = finished[i];
while(!tmp){...}


werden kann.
I hate Forumssignaturen
ExarKun
Member since Oct 2013
278 posts
ok, also wenn dann eben nur zwischen dem main und den workern....
ja dann eben ein AtomcBoolean... oder mit Thread-Array und Join. ;)
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen