Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Thread und Indy - Programmabsturz

  Alt 2. Dez 2005, 14:18
Ja, was soll ich sagen, du stellst echt gute Fragen

Wichtiger Grundsatz für gutes Nicht-Sequentielles Programmieren ist es, sperren so spät wie möglich setzen und so früh wie möglich entfernen. Dabei muss "wie möglich" auch wörtlich genommen werden.
Es ist gerade das Problem der Threads, dass du nicht sagen kannst ob es immer Probleme gibt oder nicht, kann die ersten 100000 mal gut gehen und beim nächsten nicht. Deshalb musst du es dir für dein (spezielles) Problem überlegen.

Du solltest immer dort synchronize einsetzen, wo es einen gleichzeitigen Zugriff geben kann und einer davon schreibend ist. Es ist unbendenklich beliebig viele Threads die selbe Variable lesen zu lassen, aber wenn einer ändert hast du ein Problem. Ganz wichtig ist es hier dann zu überlegen ab wo synchronized Sinn macht, beliebtes Beispiel: Zwei Threads A und B lesen x, erhöhen x um eins und schreiben es zurück. Nun sperrst du nur das Schreiben, dann kann es dazu kommen das A x liest, dann kommt b und liest x, beide erhöhen (in beliebiger Reihenfolge x), dann schreibt a x zurück (x = x+1) und jetzt kommt b ein weilchen nicht zum zug, A erhöht noch 10 mal x um 1 (x = x + 10) und nun kommt b wieder dran und nun ja, neun Erhöhungen gehen sofort verloren (b schreibt nur x+1 zurück).

Wie du hier vielleicht schon erahnen kannst, kann man schnell Dinge vergessen. Auf der sicheren Seite bist du, wenn du die ganze Methoden synchronzed setzt. Moment, merk gerade dass ich da was mit Java durcheinander bringe. Bei Delphi bekommst du ein Objekt (TCriticalSection) und musst so deine kritischen Stellen umschließen.

Um noch mal explizit auf deine Frage einzugehen, es ist egal was du änderst, es kann immer zu Problemen kommen wenn das gleichzeitig passieren könnte. Lesen kannst du hingegen aus beliebig vielen Threads gleichzeitig. Die Probleme die hier entstehen können haben nur was mit Fairness zu tun (wenn einer liest kann auch ein zweiter kommen und lesen, auch ein dritter, ... Kommt ein der schreiben will muss er warten, tja, wenn immer mehr lesende kommen wird halt nie geschrieben aber anderes Thema).
Ob eine Eigenschaft sichtbar ist oder nicht ist dabei vollkommen egal.
Wenn eine Komponente Thread-Safed ist, dann sollte ein setter dafür sorgen, dass nur ein Thread die Variable lesen bzw. schreiben kann. Ist eine Komponente nicht explizit als Thread-safed markiert, so kannst du nicht davon ausgehen dass es keine Probleme gibt.

Hoffe konnte helfen,

Gruß
  Mit Zitat antworten Zitat