![]() |
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? |
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. |
Re: Was ist threadsicher?
Zitat:
Grüße, Messie |
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.
|
Re: Was ist threadsicher?
Zitat:
|
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.
|
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: |
Re: Was ist threadsicher?
Ich kann von der Benutzung der Delphi TThread-Klasse und der Synchronize-Methode eigentlich nur abraten.
|
Re: Was ist threadsicher?
Turorial gibt s hier:
![]() |
Re: Was ist threadsicher?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz