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 ! > 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. > > > > > > <code> > > 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; > > } > > > </code>