Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#11

Re: Viele Threads untereinander synchronisieren

  Alt 15. Jan 2010, 16:31
also .. das Problem bei Threads ist eigentlich nur, dass ein Thread Daten schreibt, noch gar nicht fertig ist, und ein anderer Thread diese Daten schon liest, und dann "halb" richtige Daten liest.
Stell Dir einen Integer vor, der hat 32 Bit. also 4 Bytes.
Ein Thread fängt jetzt an, diesen Integer von 4 Byte zu schreiben und ist gerade fertig geworden mit einem Byte.
(Auch wenn es nur ein Befehl in Delphi ist, sind es unter umständen mehrere Befehle in Assembler für den Prozessor)

Wenn jetzt gerade in dem Moment ein anderer die Daten liest, dann liest er 4 Byte.
Ein Byte ist schon aktuell, die anderen 3 Byte sind noch irgendwelcher Quatsch, der vorher drin war.
Jetzt liest er einen völlig anderen Integer, als gewollt.

Es soll Quelltext geben, die mit ungültigen Daten schlecht klar kommen und dann Exceptions verursachen


Deswegen darf das Schreiben von Daten immer nur hintereinander geschehen. Und von einem Thread !
Da es verschwendung wäre, Daten nur hintereinander zu lesen, dürfen also beim Lesen auch beliebig viele Threads auf Daten zugreifen.
Es muss nur sicher gestellt werden, dass gerade niemand schreibt in dieser Zeit.
Deswegen gibt es auch das lustige Object, dass früher mal Borland für Dich programmiert hat, mit dem lustigen Namen

"TMultiReadExclusiveWriteSynchronizer"

Eine kleine Ausnahme sind Datentypen, die nur ein Byte benötigen. das Macht der Prozessor in einem Rutsch, da kann auch niemand dazuwischenfunken ... das muss nicht syncrhonisiert werden... der Prozessor liest Byteweise, nicht Bitweise ..

Zitat:
Reicht es also, die CriticalSections im Zwischenobjekt bei der Übertragung auf den Thread2 anzubringen, oder müssen die vorher schon sein, da ja Daten von Thread1 in einem Objekt verändert werden, was Thread2 gehört? (veränderung erfolgt durch Aufruf der Methode des Zwischenobjektes)

kannst Du denn etwas Code posten?
wo liegen jetzt die Daten, auf die beide Threads gleichzeitig schreiben und lesen könnten?
Geschieht diese über "zentrale" Schreib und Lesefunktionen.
Wenn Du natürlich Globale Daten hast, auf die beide Threads zugreifen (auch den Hauptthread nicht vergessen, das ist auch einer)
dann musst Du auch ein globales Syncobject einführen ...


Wenn Du das lesen und schreiben allerdings an zentraler Stelle machst und alle Threads nur diese Funktionen aufrufen, dann nur dort .
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat