AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Was ist threadsicher?

Ein Thema von Codewalker · begonnen am 13. Jul 2007 · letzter Beitrag vom 5. Aug 2015
Antwort Antwort
Seite 2 von 3     12 3      
boserPascal

Registriert seit: 4. Apr 2006
96 Beiträge
 
Delphi 5 Professional
 
#11

Re: Was ist threadsicher?

  Alt 14. Jul 2007, 00:19
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!
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Was ist threadsicher?

  Alt 14. Jul 2007, 01:17
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?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#13

Re: Was ist threadsicher?

  Alt 14. Jul 2007, 08:31
Zitat von Olli:
Ich kann von der Benutzung der Delphi TThread-Klasse und der Synchronize-Methode eigentlich nur abraten.
Dann sag mal in ein paar Worten, warum und was Du stattdessen bevorzugst oder empfiehlst.

@Codewalker Ich nehme zum Synchronisieren Mutexe, da kannst Du mal in der Hilfe nachschauen. Finde ich übersichtlicher als die anderen Methoden.

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#14

Re: Was ist threadsicher?

  Alt 14. Jul 2007, 09:47
Zitat von messie:
@Codewalker Ich nehme zum Synchronisieren Mutexe, da kannst Du mal in der Hilfe nachschauen. Finde ich übersichtlicher als die anderen Methoden.
Zurück in die Ausbildung!
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#15

Re: Was ist threadsicher?

  Alt 14. Jul 2007, 13:20
Zitat von Phoenix:
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 zeitgleich geschrieben wird.
Ich habe da mal eine kleine Einfügung vorgenommen

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 von messie:
Zitat von Olli:
Ich kann von der Benutzung der Delphi TThread-Klasse und der Synchronize-Methode eigentlich nur abraten.
Dann sag mal in ein paar Worten, warum und was Du stattdessen bevorzugst oder empfiehlst.
Direkt über die Win32-API gehen, oder eine eigene Threadklasse. Durch die Tatsache, daß viele Delphianer immer mehr zu Benutzern (von fertigen Komponenten/Klassen) verkommen statt zu Programmierern zu reifen, ist es scheinbar irrelevant geworden, was in der Doku zum Thema Synchronize steht/stand. Denn die Nachteile sind hinreichend dokumentiert. Ich zitiere mal aus der BDS2006-Hilfe:

Zitat:
Synchronize (private) Executes a method call within the main thread.
Wenn alles in Synchronize nicht mehr in dem Thread ausgeführt wird der durch die TThread-Instanz repräsentiert wird, dürfte jedem hier einleuchten was die übermäßige Benutzung dieser (IMO völlig falsch benannten) Methode bringt, nämlich das gleiche wie die Nicht-Benutzung von Threads. Habe es viel zu oft in Beispielcode innerhalb der Delphi-Community gesehen wie diese Klasse komplett falsch benutzt wird, daher die o.g. Einstellung.
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#16

Re: Was ist threadsicher?

  Alt 14. Jul 2007, 14:08
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?
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#17

Re: Was ist threadsicher?

  Alt 14. Jul 2007, 15:01
Zitat von wicht:
Wie machst du es denn, wenn du kein Synchronize benutzt?
Ganz einfach, ich überlege mir welche Daten ich übergeben muß. Meistens ist das keine Unmenge und man kommt schon mit einer Fensternachricht an den Hauptthread klar. Ansonsten implementiere ich Locking. Aber im Großen und Ganzen umgehe ich eit Jahren Synchronize indem ich kein Delphi mehr für meine Hauptaufgaben benutze

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.
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
4.096 Beiträge
 
Delphi 12 Athens
 
#18

AW: Was ist threadsicher?

  Alt 4. Aug 2015, 12:48
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
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#19

AW: Re: Was ist threadsicher?

  Alt 4. Aug 2015, 13:11
Meistens ist das keine Unmenge und man kommt schon mit einer Fensternachricht an den Hauptthread klar. Ansonsten implementiere ich Locking. Aber im Großen und Ganzen umgehe ich eit Jahren Synchronize indem ich kein Delphi mehr für meine Hauptaufgaben benutze
Egal wie Du es nennst... Ob Synchronize oder ob Du es Windows überläßt... Weil was macht den Windows?
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...

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...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#20

AW: Was ist threadsicher?

  Alt 4. Aug 2015, 13:14
Ob der Olli überhaupt noch antworten wird? (Beitrag von 2007 und der UserAccount ist gelöscht)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.
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