Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Was ist threadsicher? (https://www.delphipraxis.net/95815-ist-threadsicher.html)

Codewalker 13. Jul 2007 14:56


Was ist threadsicher?
 
Hallo liebe Wissenden.

Ich bin bisher immer ganz gut ohne das Wissen um Threads ausgekommen, aber bei der Programmierung mit Sockets kommt man da nicht drum herum. Dabei habe ich an einigen Stellen die Aufgabe (laut Delphi-Hilfe), Ereignis-Handler threadsicher zu programmieren. Was genau bedeutet threadsicher und worauf muss man da aufpassen?

Phoenix 13. Jul 2007 14:59

Re: Was ist threadsicher?
 
Beispiel:
Thread1 beginnt, in den Speicher zu schreiben
Thread1 wird unterbrochen
Thread2 läuft an
Thread2 liest den halb beschriebenen Speicher -> Datenmüll
Thread2 wird unterbrochen
Thread1 läuft an
Thread1 schreibt die restlichen Daten

Threadsicher heisst, dass es Dir bei einer solchen Klasse nicht passieren kann, dass ein Thread lesend auf einen Speicherbereich zugreift, während ein anderer Thread gleichzeitig etwas hineinschreibt. Das oben genannte Beispiel kann Dir also mit threadsicheren Klassen nicht passieren, da hier die Speicherzugriffe z.B. mit Critical Sections gekaspelt sind.

messie 13. Jul 2007 15:43

Re: Was ist threadsicher?
 
Zitat:

Zitat von Phoenix
Threadsicher heisst, dass es Dir bei einer solchen Klasse nicht passieren kann, dass ein Thread lesend auf einen Speicherbereich zugreift, während ein anderer Thread gleichzeitig etwas hineinschreibt.

Ist es also möglich, aus mehreren Threads gleichzeitig lesend auf denselben Speicherbereich zuzugreifen ohne das abzusichern?

Grüße, Messie

SirThornberry 13. Jul 2007 15:45

Re: Was ist threadsicher?
 
naja, nicht ganz. Der Arbeitsspeicher kann natürlich nur einwas gleichzeitig machen. Aber ansich können 2 threads schon gleichzeitig vom gleichen Speicherbereich lesen.

Olli 13. Jul 2007 15:45

Re: Was ist threadsicher?
 
Zitat:

Zitat von messie
Zitat:

Zitat von Phoenix
Threadsicher heisst, dass es Dir bei einer solchen Klasse nicht passieren kann, dass ein Thread lesend auf einen Speicherbereich zugreift, während ein anderer Thread gleichzeitig etwas hineinschreibt.

Ist es also möglich, aus mehreren Threads gleichzeitig lesend auf denselben Speicherbereich zuzugreifen ohne das abzusichern?

Moeglich schon, aber sobald du keine Mechanismen zum Absichern benutzt, koennte es sein, dass jeder Thread was anderes zu sehen bekommt, weil sich zwischendurch was geaendert hat. Wenn du also das Lesen nicht in deine Gleichung einbeziehst, koennten die Ergebnisse ziemlich inkonsistent werden.

Codewalker 13. Jul 2007 16:31

Re: Was ist threadsicher?
 
Okay, das Prinzip/Problem hab ich verstanden, ist ja fast logisch. Kennt ihr denn einen guten Einstieg (Anleitung/Tutorial) dazu, weil ich mich halt noch nie mit derartigen Problemen und Strukturen (z.B. Critical Sections) beschäftigt habe.

wicht 13. Jul 2007 16:45

Re: Was ist threadsicher?
 
Es gibt dazu Tutorials. Da solltest Du einfach mal googeln.. Sorry, scheiß Antwort :-D

Naja, aber der Ablauf ist eigentlich einfach.
Du erstellst zwei Threads, und gibts beiden als Eigenschaft oder direkt im Konstruktor eine Instanz einer Klasse mit, zum Beispiel TFileWriter. Diese Instanz wurde erstellt bevor die Threads erstellt wurden, logisch, und beide Threads kennen dann das selbe TFileWriter-Objekt. TFileWriter hat eine Prozedur SchreibeDaten(Daten: Typ), damit können die Threads Daten irgendwo hinschreiben, sagen wir halt in eine Datei. Beide Threads machen irgendwas und schreiben einfach Sachen indem Sie TFileWriter.SchreibeSachen(MeineDaten) aufrufen. Um das vernünftig zu machen, hat die Klasse TFileWriter (oder die Prozedur SchreibeDaten()) eine Instanz von TCriticalSection. Die erstellst du im Konstruktor der Klasse TFileWriter (oder halt ganz oben in der Prozedur..). Oben in SchreibeDaten() ist ein CritSect.Enter und ganz unten ein CritSect.Leave. Wenn jetzt ein Thread mit der Prozedur was schreiben möchte, aber der andere schon drin ist und dabei unterbrochen wurde, wartet der Thread, der schreiben möchte so lange, bis der andere aufgehört hat zu schreiben.. So kommen die Daten immer so an, wie man es geplant hat.
Vielleicht ist das Beispiel etwas komisch, aber so funktioniert es (wenn nicht, klärt mich auf!).

Also, vielleicht nochmal ein wenig googeln noch, und schau dir auch mal die Methode Synchronize() an. Die braucht man auch des öfteren, wenn man mit Threads am dölmern ist..

Viel Erfolg! :stupid:

Olli 13. Jul 2007 18:10

Re: Was ist threadsicher?
 
Ich kann von der Benutzung der Delphi TThread-Klasse und der Synchronize-Methode eigentlich nur abraten.

Luckie 13. Jul 2007 19:18

Re: Was ist threadsicher?
 
Turorial gibt s hier: http://delphitutorials.michael-puff.de

Phoenix 13. Jul 2007 21:31

Re: Was ist threadsicher?
 
Zitat:

Zitat von messie
Ist es also möglich, aus mehreren Threads gleichzeitig lesend auf denselben Speicherbereich zuzugreifen ohne das abzusichern?

Klar. Nur lesen ist bei sowas nie ein Problem. Problematisch wird es erst, wenn dort geschrieben wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz