![]() |
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:
|
Re: Was ist threadsicher?
Allgemein regelt man dies über Semaphore. Das heißt du zählst eine Zahl beim Schreibzugriff hoch und wenn du fertig bist wieder runter. Geschrieben darf nun nur werden wenn Die Zahl Null ist, dh keine Lesezugriffe stattfinden. Du mußt also nur sicherstellen können, dass es zu Zeitfenster zum Schreiben kommt.
Gruß Stefan! |
Re: Was ist threadsicher?
Critical Sections eignen sich meistens auch. Ein Semaphore ist insbesondere dann nützlich, wenn... ne. Ein Semaphore ist bei sowas eigentlich gar nicht nützlicher als eine Critical Section, es sei denn, man will eine Warteschlange einrichten.
Oder? |
Re: Was ist threadsicher?
Zitat:
@Codewalker Ich nehme zum Synchronisieren Mutexe, da kannst Du mal in der Hilfe nachschauen. Finde ich übersichtlicher als die anderen Methoden. Grüße, Messie |
Re: Was ist threadsicher?
Zitat:
Das Verfahren nennt sich Mutex (Mutual Exclusion / Wechselseitiger Ausschluss) und wird entweder mit (ggf. binären) Semaphoren, dazu zählen auch die Monitore, oder mit Locks implementiert. Der Codeteil, der durch einen Mutext geschützt ist, ist die Critical Section. Also bitte nicht durcheinander würfeln. |
Re: Was ist threadsicher?
Zitat:
Atomische Operationen sind eigentlich nur bei einer Interlocked-Operation gegeben, bei Nicht-SMP/Nicht-Multicore aber theoretisch auch bei einfachen Operationen bis zur Standard-Wortbreite der CPU. Zitat:
Zitat:
|
Re: Was ist threadsicher?
Klar, mitdenken muss man schon. Ständig im Thread Synchronize benutzen ist in der Tat unsinning, aber wenn man alle Paar Sekunden Informationen an den Hauptthread übergeben möchte, klappt das doch?
Wie machst du es denn, wenn du kein Synchronize benutzt? |
Re: Was ist threadsicher?
Zitat:
Anderes Beispiel: nähmen wir an jemand solle ein Array erstellen und mit Werten füllen. Das Erstellen kann im Hauptthread erfolgen, aber da die Werte bspw. über das Netzwerk angefragt werden, dauert das länger, weshalb man sich entscheidet einen Thread für jeden zu füllenden Wert zu erstellen (kann ja auch nacheinander geschehen um die Auswirkung von Timeouts zu vermindern, es müssen also nicht genausoviele Threads wie Werte existieren). Der Thread bekommt dann die Adresse des zu füllenden Wertes mit und beschreibt die unter Verwendung eines Locks (bei "viel" Daten) oder einer Interlocked-Operation bei einem kleinen Datum. |
AW: Was ist threadsicher?
Hallo Olli,
ich benutze Locks wenn ich Variablen Schreibend/Lesend austauschen möchte, und Syncronize wenn ich mal eine Message an den Hauptthread absenden muss. Ganz verteufeln würde ich Syncronize nicht, denn im Prinzip macht es doch auch nur intern was man sonst von Hand schreiben müsste. Ich gebe aber zu das ich mir die Implementierung von Synchronize noch nicht angesehen haben. Und es gibt auch noch Queue, hälst du davon dann auch nichts ? Einen Riesenvorteil gegenüber deiner Win.Thread.Create Lösung sehe ich in der Platformunabhängigkeit. Das möchte ich wirklich nicht auf allen Platformen von Hand optimieren. Rollo |
AW: Re: Was ist threadsicher?
Zitat:
Eine Fensternachricht ist nahezu nix anderes als ein Commandpool der dann synchronisiert wird... Naja und dann funktioniert es nur unter Windows... Das will doch keiner mehr...8-) Synchrinize oder Queue sind die richtigen Wege um die GUI upzudaten... Kommt immer darauf an, ob ich dafür den Thread "anhalten" will oder nicht. Ich gebe Dir Recht, dass in vielen Beispielen Threads mit GUI verbunden wird, aber das ist doch eher zur Demonstration - damit am sieht was ein Thread macht... Der Trick an Threads eigentlich anders herum... Soviel wie möglich CPU-Zeit für den MainThread bereit zu stellen, damit der Bildschirm reaktiv bleibt... |
AW: Was ist threadsicher?
Ob der Olli überhaupt noch antworten wird? (Beitrag von 2007 und der UserAccount ist gelöscht) :stupid:
|
AW: Was ist threadsicher?
Zitat:
|
AW: Was ist threadsicher?
Naja, bei mir wars als neu markiert ??!!
|
AW: Was ist threadsicher?
|
AW: Was ist threadsicher?
Zitat:
Richtig ist natürlich, dass wenn A Thread-Safe ist und B es benutzt, B noch lange nicht Thread-Safe seinen muss... Bei der Thread-Safe-Frage geht es doch aber i.d.R. um zwei Dinge... 1. Wie muss ich meinen Thread-Code bauen, damit ich Ihn von mehreren Seiten oder in einem Thread benutzen kann. 2. Ist die XY Routine oder das XY Object aus der RTL Thread-Safe oder reentrant. Mavarik |
AW: Was ist threadsicher?
Zitat:
Frag dich mal, warum immutables und funktionale Programmierung so gut für Concurrency funktioniert: weil es dort keinen shared state gibt, um den man sich sorgen muss. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 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