![]() |
Thread und Methodenaufrufe
Hallo zusammen.
Ich bastel wieder mal mit Threads (nonVCL bzw. nonRTL) rum, habe einen Thread innerhalb eines Objekts gestartet und zwar nach diesem Konzept: ![]() Ich habe nun also ein Objekt welches einen Thread gestartet hat. Aus diesem Thread führe ich nun Methoden des Objekts aus bzw. greife lesend auf Propertys zu. Kann ich nun auch weiter problemlos aus dem "Hauptthread" auf die Propertys und Methoden zugreifen (bisweilen nur lesend), oder muss ich das sychronisieren? Falls dies einer Synchronisation Bedarf: Wie mach ich das am elegantesten? |
Re: Thread und Methodenaufrufe
synchronisieren ist notwendig
Du machst es über getter und setter-Methoden, wobei das Lesen und schreiben z.B. über eine Critical Section abgesichert ist. Alternativ kannst du dein Objekt von TMultiReadExclusiveWriteSynchronizer (oder so ähnlich) ableiten und mit den Beginxxx und endxxx Methoden arbeiten. |
Re: Thread und Methodenaufrufe
Wie sieht das denn bei Methodenaufrufen aus? Müssen die auch mittels Critical Section abgesichert werden? Kann man die überhaupt so nutzen?
|
Re: Thread und Methodenaufrufe
Besser ist, du vermeidest das gleich vom Konzept her.
Du darfst halt nicht auf gleiche Speicherplätze, sprich gleiche Variablen, zugreifen. |
Re: Thread und Methodenaufrufe
Das Problem ist glaube ich das Konzept:
Es geht um eine Netzwerkanwendung (es sollen nur kleine Steuerbefehle gesendet werden) bei der ich den Empfang in einen Thread ausgelagert hab. Die Frage ist nun wie bewältige ich das Senden und Empfangen was den Datenaustausch mit dem Hauptthread betrifft. Hauptproblem ist die Verwaltung der Clients: Ich brauche eine Datenstruktur in der die Clients gelistet sind, sodass ich Infos zu den Clients dort ablegen kann. Der Haupthread soll dann "Anweisungen" geben können (z.B. Senden gewisser Daten), wobei der andere Thread sich dann um das Senden sowie die Verarbeitung der Empfangenen Daten kümmert. |
Re: Thread und Methodenaufrufe
Wenn nur ein Thread schreibt, brauchst du keine Synchronisation.
|
Re: Thread und Methodenaufrufe
Zitat:
|
Re: Thread und Methodenaufrufe
Stimmt. Bei einer einfachen Liste ist es allerdings ziemlich leicht, schreibende Zugriffe atomar sichtbar zu machen.
|
Re: Thread und Methodenaufrufe
Schau Dir doch mal eine
![]() Ich würde prinzipiell sowohl Getter und Setter mit Critical Sections schützen, auch die Operation an sich scheinbar unteilbar ist. Wer weiss, was zukünftige CPU's so bringen? Wer sagt mir denn, das die nächste CPU-Generation nicht in der Lage ist, einen 32bit-Wert parallel zu beschreiben bzw. zu lesen? Diese Schutzblöcke zeigen zudem direkt an, das das Objekt auch für den multithreaded-Betrieb ausgelegt ist (Stichwort: Selbsterklärender Code). |
Re: Thread und Methodenaufrufe
Intel wird wohl kaum CPUs auf den Markt bringen, die den gleichen Maschinencode wie heutige verstehen, aber auf subtile Weise inkompatibel sind. 32-Bit-Movs sind in den Handbüchern als atomar beschrieben. Jeder C-Compiler, der Volatile versteht, wird für 32-Bit-Schreibvorgänge auch nur movs generieren.
|
Re: Thread und Methodenaufrufe
Delphi-Quellcode:
nur das der Delphicompiler mit dem lock manchma Probleme hat -.-°
lock mov [eax], edx
|
Re: Thread und Methodenaufrufe
Himitsu, wenn der Delphi-Compiler das zulassen würde, hätte das lediglich zur Folge, dass dir eine Invalid-Opcode-Exception um die Ohren fliegt. Das lock-Präfix ist nur für Anweisungen gültig, bei denen gelesen und geschrieben wird.
|
Re: Thread und Methodenaufrufe
ich kenn da manchma nur die "External Exception C000001E" in Verbindung mit MOV,
ansonsten geht's bei mov, or, xor, and, cmpxchg und co und damit wird ja wohl geschrieben/gelesen (oftmals) |
Re: Thread und Methodenaufrufe
Danke für die zahlreichen Antworten!
Die Threadpool-Klasse kenne ich natürlich bereits, aber ich denke, dass es kompliziert wird mein Problem auf die Klasse zu übertragen (evtl. auch ein bisschen Overkill). Das Konzept der Queue für die Jobs könnte ich aber vielleicht für mein Problem nutzen. Mir schwebt da schon etwas vor. Außerdem sollte eine Queue mittels Critical Sections doch ruck zuck Threadsicher zu machen sein, oder? |
Re: Thread und Methodenaufrufe
@himi und Apollo
Zitat:
|
Re: Thread und Methodenaufrufe
Das ist doch genau meine Rede. Alle diese Anweisungen lesen eine Speicherstelle aus und schreiben einen veränderten Wert zurück.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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