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

Re: Capture bei Multi threads Kategorie: Programmierung (von Sebastian - 3.03.2007 14:25)
Als Antwort auf Capture bei Multi threads von Sebastian - 2.03.2007 13:44

Hi,

hier mal eineinfaches beispiel.
im thread producer wird das signal vom can-bus gelesen und in signale gespeichert.
ausserdem wird in signale auch gespeichert wieviele signale dort momentan gespeichert sind.

der thread consumer nimmt die signale und verarbeitet sie (er konsumiert).
versuche dir klarzumachen was passiert, wenn im falschen moment
zwischen den threads umgeschaltet wird (stelle habe ich markiert)

achtung: selbst wenn du nur eine zeile code benötigst um eine
variable die von mehreren thread benutzt wird zu bearbeiten, heisst das nicht,
dass das in maschinencode auch nur ein befehl ist.

a = a + 1

wäre zb etwas wie:

LOAD a
// thread wechsle möglich!
LOAD 1
// thread wechsle möglich!
ADD

abhilfe schafft also das capture:
zu jeder variable v die von mehreren threads benutzt wird erstellst du eine globale lock variable.
immer wenn du v ändern willst speicherst du das in lock.

etwa so:

if lock:
  warte bis lock == 0
else
  lock == 1

  mache was mit v

  lock == 0

das problem bei dieser lösung: falls hier im falschen zeitpunkt
zwischen den threads umgeschaltet wird hast du das gleiche problem wie mit v an anderer stelle.

nutze daher capture lock.

die cc2 stellt sicher, dass während der bearbeitung von
capture nicht zwischen den threads umgeschaltet wird.







type signale_typ{

   byte elemente; //anzahl der momentan zwischengespeicherten signale
   byte element[MAX];

}

signale_typ signale;

byte lock; /* Synchronisationsvariable. (GLOBAL)


thread producer{

   signal = canbus.lese_signal();
   
   //geschützen bereich betreten, vorher warten bis consumer ihn verlässt
   capture lock;

      signale.elemente = signale.elemente + 1;
      // chaos wenn zu thread consumer gewechselt würde (ohne capture)
      signale.element[ signale.elemente ] = signal;

   release lock; //geschützen bereich verlassen, consumer kann jetzt eintreten
   
}

thread consumer{
   
   // warten auf neue signale
   // (hat nichts mit capture zu tun, wird aber oft im zusammenhang benötigt)
   wait signale.elemente;
   
   //geschützen bereich betreten, vorher warten bis producer ihn verlässt
   capture lock;
 
      konsumiere( signale.element[ signale.elemente ] );
      // chaos wenn zu thread producer gewechselt würde (ohne capture)
      signale.elemente = signale.elemente - 1;

   //geschützen bereich verlassen, producer kann jetzt eintreten
   release lock;  

}
   



    Antwort schreiben


Antworten:

Kleine Bitte (von André H. - 3.03.2007 15:46)