Re: Frage zu Capture und Funktionen Kategorie: Programmierung (von André H. - 17.05.2003 8:58) | |
Als Antwort auf Frage zu Capture und Release von Thomas Steudle - 16.05.2003 17:45
| |
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. globale 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: byte flag; thread a {byte second;  //run 16;  capture flag;  lcdext.line(1);  lcdext.zahl2(system.hour());  lcdext.put(':');  lcdext.zahl2(system.minute());  lcdext.put(':');  lcdext.zahl2(system.second());  release;  second=system.second();  wait system.second()!=second; } thread b {string s;  //run 16;  capture flag;  lcdext.line(2);  s="";  str.putlong(s,system.timer());  lcdext.print(s);  release;  sleep 10; } thread main {  lcdext.init();  run a;  run b;  wait ports.getHostkey();  quit 1; } 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; > } > Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | |
Antwort schreiben Antworten: |