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 Tom, > > Ich gehe einmal aus, daß die Threads von einem weiterem mit run gestartet wurden. > Das wäre auch nicht das Problem. > > Das Problem ist eher, daß ich keinen Sinn bzw. keine Funktion in diesen > Tests sehe. > > Du hast 4 globale Variablen in den Threads definiert: > a.i, a.j, b.i, b.j > > In der Fuktion sind zwei lokale Variablen definiert: > a und b > > Was ich nirgends sehe ist, wo Werte zugewiesen werden !? > Die Globalen Variablen haben am Anfang den Wert 0. Daran > ändert sich in diesem Code auch nichts. > Du übergibst aus beiden Thread diese Variablen mit dem Wert 0 > an Variablen a und b die Funktion. diese rechnet dann 0 + 0 > und speichert das Ergebnis 0 in die lokale Variable 0, welche am > Ende der Funktion verworfen wird. > > Ich glaube, daß Dir nicht ganz klar ist, wie lokale Variablen funzen: > Beim Programmstart gibt es keine Variablen a und b. > Diese werden erst beim Aufruf der Funktion einem Speicherbereich "zugewiesen" > und die zu übergebenden Werte in diesen gespeichert. > Ich die Funktion beendet, wird der Speicherbereich der beiden Variablen > wieder freigegeben, also die "Zuweisung" aufgehoben. > Um zum Multithreading zu kommen: > Da die Variablen der Funktion lokal sind, können von dieser beliebig viele > Instanzen aufgerufen werden. Bei jeder Instanz belegen a und b andere > Speicherbereiche. Darum ist es auch möglich, daß sich Funktionen > selbst aufrufen. > > Mehr dazu siehe im CC2(-Unit)-Handbuch ab Kapitel "5.8 Funktionen" ab > Seite 66 und besonders "5.8.2 Parameter und Lokale Variablen" auf Seite 68. > > Daher ist beim Aufruf von Funktionen, bei denen nicht schreibend auf > von mehreren Threads genutzte globale Variablen oder andere gemeinsam > genutzte Recourcen zugegriffen wird, auch kein Capture sinnvoll, da es nicht benötigt wird. > Captures werden nur benötigt, wenn Resourcen geteilt werden, was jedoch > bei deinem Code nicht der Fall ist. Eine Funktion ist keine geteilte Recource. > Geteilte Recourcen wären, wenn mehrere Threads gleichzeitig > Zugriff auf z.B. <b>globale</b> Variablen, Schnittstellen(hwcom,swcom,lpt), > Busse(I²C, CAN), LCD etc. hätten. > Also überall, wo etwas durcheinander kommen könnte. :-) > > Als Beispiel hier der Zugriff von zwei Threads auf ein externes LCD: > <font face="courier new" size=2> > <b>byte</b> flag; > <b>thread</b> a > {<b>byte</b> second; > //run 16; > <b>capture</b> flag; > lcdext.line(1); > lcdext.zahl2(system.hour()); > lcdext.put(':'); > lcdext.zahl2(system.minute()); > lcdext.put(':'); > lcdext.zahl2(system.second()); > <b>release;</b> > second=system.second(); > <b>wait</b> system.second()!=second; > } > > <b>thread</b> b > {<b>string</b> s; > //run 16; > <b>capture</b> flag; > lcdext.line(2); > s=""; > str.putlong(s,system.timer()); > lcdext.print(s); > <b>release;</b> > sleep 10; > } > > <b>thread</b> main > { > lcdext.init(); > <b>run</b> a; > <b>run</b> b; > <b>wait</b> ports.getHostkey(); > <b>quit</b> 1; > } > </font> > > Zum Testen, was ungecaptured passiert, kannst Du die Captures entfernen > und die Prio mit run 16 etwas kleiner einstellen. Dann passierts schneller. :-) > > MfG André H. > > > > Variante 1 ------------------------------------------------------------------------------------------ > > > > byte flag1; > > > > function testcapture(int a,int b) > > { > > a=a+b; > > } > > > > thread a > > { > > int i,j; > > capture flag1; > > testcapture(i,j); > > release; > > } > > > > thread b > > { > > int i,j; > > capture flag1; > > testcapture(i,j); > > release; > > } > >