Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > Hallo Georg, > > Zuerst Sorry für die späte Antwort. > > > Und trotzdem bringt mich Deine Aussage zum „quit -1“ zum > > Nachdenken: > > ... > > ... > > Ein entsprechender Hinweis, dass bei mehreren Threads eben die strenge > > Ablaufreihenfolge im Code durcheinander kommt, wäre > > vielleicht noch eine gute Ergänzung in Deinem so guten Buch > > zur C-Control II. Auch im Conrad-Manual wird nicht explizit > > darauf hingewiesen. So ein „Negativ-Beispiel“ wie mein Test-Programm > > lässt einem die Sache dann besser verstehen. > > Das ist ja gerade das, was Multithreading ausmacht. > Die Threads laufen unabhängig voneinander. > Ansonsten wäre es kein Multithreading. :-) > > > Wie kann ich das Betriebssystem "disziplinieren" einen > > Thread vollständig durchlaufen zu lassen, natürlich auf Kosten > > anderer ? Muss ich dass mit der Synchronisation mit z.B. „wait free“ > > machen, wie im Conrad-Manual aufgeführt? > > Nein. Du hast eben das gesamte Programm und nicht nur den einen Thread mit > quit angehalten. > > Stell' Dir einmal folgendes vor: > > Du hast 3 Räder - nennen wie Sie "main", "a" und "b". > Das Rad "main" fangt beim "Programmstart" von selbst an zu drehen. > Dieses Rad löst bei bestimmten Positionen (z.B. 5° von der Startposition entfernt) das Drehen von Rad "a" > und anschließend von Rad "b" aus. > Das wäre dann sozusagen folgendes: > <code>thread main > {//Startposition > ... > run a; // Das wären die "5°" > run b; > ... > }</code> > > Mit halt kannst Du nun bestimmte Räder anhalten. > (Bei der Impliziten Form den thread, in dem "halt;" steht, bei der > expliziten Form den angegebenen Thread, egal, wo dieser steht.) > Mit quit hälst Du alle Räder sofort an, egal wo sie gerade stehen. > > > Wie kann ich das Programmverhalten bei zeitlich kritischen Dingen > > voraussehen? > > Das geht theoretisch nur, wenn Du die VM-Codes mit zählst, weißt > wie lange eine VM-Instruktion dauert usw. > Wenn jedoch auf "externe" Ereignisse gewartet werden muß, > z.B. reicht hier schon ein wait hwcom.ready(), ist dies unmöglich. > Eigentlich geht das nur bei sehr einfachen Programmen, möglichst > ohne sleep und wait. (Was aber eigentlich nicht möglich ist.) > > Allerdings sollte dies unwichtig sein, da ein Multithreading-Programm > immer so aufgebaut sein sollte, daß sich die Threads nicht gegenseitig > blockieren, wenn dies nicht beabsichtigt ist. > Ein beabsichtigtes Blockieren wäre z.B. ein Capture, das jedoch > in erster Linie dazu dient Resourcen (Hard-und/oder Software) vor > "gleichzeitigem Zugriff zu schützen". > In zweiter Linie dient ein Capture auch dazu Threads zu Syncronisieren. > Beides hat aber miteinander sehr viel gemeinsam, so daß man > bei Captures generell von Syncronisieren von Thread sprechen kann. > > > In Deinem Buch zur C-Controll II gehst Du nur kurz darauf ein. > > Zuerst: Es ist nicht "mein Buch", sondern ich habe einen Teil dazu beigesteuert. :-) > Den Löwenanteil hat B.Kainka geschrieben. > U.a. auch den Teil mit dem Multithreading. > Ich will schließlich nicht alle Lorbeeren für das Buch ernten, wenn B.Kainka > auch einige(über die Hälfte) zustehen. :-) > > > Ich kann die Anzahl der ununterbrochenen virtuellen Befehle durch > > die Prio verändern, das habe ich aus dem Buch gelernt. > > Das stimmt. Auch nehmen aber sleep und wait darauf Einfluß, > da ein sleep immer die Rechenzeit an den nächsten Thread abgibt und wait, > wenn die Bedingung False ist. (Und yield ist vergleichbar mit einem sleep 0. > Oder eben umgekehrt - wie man's eben sieht :-) ) > > > > Eine Antwort ist nicht dringend bzw. ich werde auch selber nachforschen > > um die Sache ganz zu verstehen. > > Das beste ist, am Anfang einfach ein wenig mit einfachen Programmen rumzuprobieren, > um zu testen, wie sich Programme bei verschiedenen Prios verhalten. > > Als Beispiel könnte man z.B. folgendes machen: > <code>long c1,c2,c3; > thread a > { > run 50; > loop > { > c1=c1+1; > } > } > > thread b > { > run 100; > loop > { > c2=c2+1; > } > } > > thread c > { > run 200; > loop > { > c3=c3+1; > } > } > > thread main > { > run a; > run b; > run c; > sleep 2000; > halt a; > halt b; > halt c; > hwcom.init(); > hwcom.setspeed(8); > hwcom.clr(); > hwcom.num(c1); > hwcom.ret(); > hwcom.num(c2); > hwcom.ret(); > hwcom.num(c3); > quit 1; > }</code> > > > MfG André H.