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) |