Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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: