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

Re: Langzeitstabilität der CC2-Station? Kategorie: CC2-Unit & Appl.Board / CC2-Station (von Olaf - 26.02.2004 12:25)
Als Antwort auf Re: Langzeitstabilität der CC2-Station? von Ralf - 25.02.2004 0:01
Ich nutze:
C-Control II Station, OSOPT_V2
Ralf,
so ganz kann ich deine Argumentation mit dem wann muss ich wie
globale varibalen bei multithreading schützen nicht nachvollziehen.

Im Conrad Handbuch ist die Probelmatik bei Multithreading doch wunderbar (und richtig) erläutert
? Aliasing von Speicherzugriffen
? Konkurrenz mehrerer Prozesse um eine Ressource

Weiter unten im Handbuch steht dann wie capture und release funktionieren.
Damit gilt (zumindest unter original OS und OSOPT_V2)

"Die capture-Anweisung existiert in einer expliziten und einer impliziten Form. Die
explizite Form erwartet die Angabe eines Bezeichners einer globalen (!) byte-Variable."

 ... mein tipp nur die explizite benutzen, die implizite ist nicht so gut nachvollziehbar und spart
weder speicher noch rechenzeit....

"Beim Ausführen der capture-Anweisung testet der aktuelle Thread, ob der Wert der
Variablen 0 ist (= ??Freizeichen?). Wenn ja, dann schreibt der Thread seine eigene Nummer
(Wert 1 ? 255) in die Variable und merkt sich die Adresse der byte-Variable. Wie
bereits erwähnt, dieser Vorgang läuft atomar, in einer einzigen Operation der virtuellen
Maschine ab."

So, und damit ist dann wohl auch klar das nur ein schützen von Lese oder Schreibzugriffen
auf globale Variablen NICHT ausreicht. Im Multithreading müssen, sofern ein schreibender thread
exisitert, ALLE also sowohl Schreib- als auch Lesezugriffe mit capture/release geschützt werden !!

Ansonsten kann genau der Fall eintreten den Ralf unten beschreibt...

> hat z.B Thread xy gerade in  Byte 3 und Byte 2 der Variable einen Teil
> vom neuen Wert eingetragen und dann wird umgeschaltet auf Thread z. Von Thread z wird gerade
> jetzt die Variable gelesen, und schon existiert ein Wert, den es so gar nicht geben dürfte.

und wie jemand anders gesagt hat irgend wann wird der Fall auch eintreten !

Wenn man dieses nicht tut braucht man sich nicht über die Langzeitstabilität wundern und
auch keine Hardware tauschen...
 
?brigens betreibe ich eine Haussteuerung mit ca. 60 I/O ports 2 externen LCD display, diverser
Zusatzhardware. Die Software ist voll multithreaded, arbeitet mit Interrupts von den MAX7311
und PCF chips und ist sehr flexibel und erweiterbar entworfen. Die volle Ausbaustufe habe ich noch nicht
erreicht aber die CC2Station läuft seit fast 2 Jahren (ich hatte damals eine der ersten) ohne Probleme oder
undeterministschem Verhalten. Allerdings auch im Keller, wo immer ca. 15 Grad Temp sind.
Inzwischen bin ich sehr zuversichtlich was die Langzeitstabilität der Hardware und des OS angeht.

Olaf



> Hallo Frank
>
> ( sun ist eine globale long-Variable )
>       capture glob.cFlag;
>       glob.sun = 0;
>       release;
>
> Nach einem capture mu? mit release das Multitasking so schnell wie möglich wieder frei gegeben
> werden.
> Dieses Verfahren ist erforderlich, wenn über globale Variablen Daten zwischen Threads ausgetauscht
> werden. Wenn es möglich ist, dass zwei Threads gleichzeitig auf die Variable zugreifen, einer zum
> lesen, der andere zum schreiben, dann tun sie das auch irgend wann mal, das ist sicher.  
> Bei so einem Fehler hat z.B Thread xy gerade in  Byte 3 und Byte 2 der Variable einen Teil
> vom neuen Wert eingetragen und dann wird umgeschaltet auf Thread z. Von Thread z wird gerade
> jetzt die Variable gelesen, und schon existiert ein Wert, den es so gar nicht geben dürfte.
>
> Eins von beiden mu? dann geschützt werden: Die Lese- oder die Schreibzugriffe. Man wird
> die Schreibzugriffe schützen, wenn sie von verschiedenen Threads ausgeführt werden und/oder
> wenn die Zahl der Lesezugriffe grö?er ist als die der Schreibzugriffe. Nur wenn von einem Thread
> relativ wenig Lesezugriffe erfolgen und viele Schreibzugriffe in EINEM Thread (nacheinander)
> ausgeführt werden, wird man den/die Lesezugriffe schützen.  
>
> Bei Hardwarezugriffen ist es ähnlich (wenn die Treiber nicht schon gecapturet sind, da muss Du
> Dir die Funktionen mal genau ansehen).
>
> Beim Fehlersuchen kannst Du capture/release ruhig verstreuen wie Salz. Noch besser ist: Andere
> Threads erstmal abzuschalten um zu gucken, was passiert dann.
>
> Viele Grü?e
> Ralf
>
>
>
> > Hallo Ralf!
> >
> > Vielleicht löst das ja auch mein Problem, wäre zu schön um wahr zu sein. Du hast wirklich jeden
> > Zugriff auf eine globale Variable geschützt? Könntest Du mir vielleicht mal Auszüge Deines
> >  Programms zeigen? Würd mich mal interessieren, wie die das nun genau gemacht hast? Will ja nun
> > auch keine capture/release verstreuen wie das Salz in der Suppe.
> >
> > Besten Dank im Voraus,
> > Frank


    Antwort schreiben


Antworten:

Re: Langzeitstabilität der CC2-Station? (von Frank - 26.02.2004 13:47)