Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Parallele Thread Datencontainer Nutzung (https://www.delphipraxis.net/97385-parallele-thread-datencontainer-nutzung.html)

DarkPressure 9. Aug 2007 15:40


Parallele Thread Datencontainer Nutzung
 
Hallo erstmal,
ich hätte da ne Frage bezüglich der Datentyp bzw. Synchronisation zwischen 2 Threads.
Meine Situation ist folgende: Ich öffne 2 Threads, der eine Thread(I) hat die Aufgabe einen Datencontainer(String/Char/..) mit Daten zu füllen. Thread(II) ist parallel dabei Daten aus diesem Container zu lesen und auch zu entfernen. Momentan hab ich Bedenken, dass es dabei zu Konflikten kommen könnte. Bezüglich der Variablen zwischen 2 Threads hab ich mir Bereits Luckies PDF über Threads durchgelesen, jedoch wurde ich da nur schlauer in Bezug auf 2 Zahlencontainer. Deswegen würde ich grundsätzlich wissen, sind diese Bedenken evtl. unbegründet, oder welcher Datentyp sich idealerweise anbieten würde und wie ich die Zugriffe auf den Container am besten regle.
Danke für jede Antwort,
DarkPressure

shmia 9. Aug 2007 16:17

Re: Parallele Thread Datencontainer Nutzung
 
Du brauchst neben dem Datencontainer ein Objekt der Klasse TCriticalSection.
(wird vom Hauptthread erzeugt)
Delphi-Quellcode:
// im Thread bei jedem Zugriff auf den datencontainer
critsect.Enter;
datencontainer.Add(...);
critsect.Leave;

DarkPressure 9. Aug 2007 20:40

Re: Parallele Thread Datencontainer Nutzung
 
Zitat:

Zitat von shmia
Du brauchst neben dem Datencontainer ein Objekt der Klasse TCriticalSection.
(wird vom Hauptthread erzeugt)
Delphi-Quellcode:
// im Thread bei jedem Zugriff auf den datencontainer
critsect.Enter;
datencontainer.Add(...);
critsect.Leave;

Ich wollte nicht unbeding Indy Komponenten einbinden.
Gibt es keinen weg über die Win API?

sirius 9. Aug 2007 21:01

Re: Parallele Thread Datencontainer Nutzung
 
Wie kommst du auf Indy :gruebel: ?
TCriticalSectioin ist eine Komponente der VCL. Du kannst dasselbe erreichen indem du die WinAPI-Funktionen verwendest:

InitializeCritcalSection
EnterCriticalSection
LeaveCriticalSection
DeletecriticalSection

Mit InitilaizeCriticalSection erzeugst du ein Object (LPCRITICAL_SECTION) welches du global irgendwo ins Programm legst und welches du dann immer benutzt. Wenn du EnterCriticalSection aufrufst werden alle anderen Threads blockiert. Nach Leavexxx geht alles wieder seinen gewohnten Gang.
Aber TCriticalSection macht auch nix anderes.


Alternativ kannst du auch versuchen mit Messages zu arbeiten.

Christian Seehase 9. Aug 2007 21:14

Re: Parallele Thread Datencontainer Nutzung
 
Moin Zusammen,

Zitat:

Zitat von sirius
Wenn du EnterCriticalSection aufrufst werden alle anderen Threads blockiert.

Vielleicht präziser:
Andere Threads, die EnterCriticalSection mit dem gleichen Objekt aufrufen bleiben an dieser Stelle stehen, bis der Thread der gerade die CriticalSection durchläuft das Objekt mit LeaveCriticalSection wieder freigegeben hat.

DarkPressure 10. Aug 2007 00:47

Re: Parallele Thread Datencontainer Nutzung
 
Zitat:

Zitat von sirius
Wie kommst du auf Indy :gruebel: ?

Hab mich der Borland Hilfe bedient und bin unglücklicherweise bei Indy gelandet.
Und danke für die Tipps, werde mich gleich dere annehmen ^^

OlafSt 10. Aug 2007 09:19

Re: Parallele Thread Datencontainer Nutzung
 
Ich habe irgendwo gelesen, das CriticalSections zum langsamsten gehören, was man zur Thread-Sync benutzen kann. Vielleicht hat sich das derweil geändert ?

Ansonsten würde ich einen MultiReadExclusiveWriteSynchronizer (ja, das Ding heißt wirklich so !) verwenden. Dieses Teil basiert IIRC nicht auf CritSects und dürfte somit schneller sein - erfüllt aber bei ausschließlicher Verwendung von "BeginWrite" denselben Zweck.

DarkPressure 10. Aug 2007 16:25

Re: Parallele Thread Datencontainer Nutzung
 
Sorry hat sich erledigt.
Hatte da ein bischen Mist gebaut ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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