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/)
-   -   TThreadList und das Verhalten von Threads? (https://www.delphipraxis.net/191631-tthreadlist-und-das-verhalten-von-threads.html)

uups 3. Feb 2017 18:03

TThreadList und das Verhalten von Threads?
 
Hallo!

Wie verhalten sich die Threads, wenn die gerade versuchen auf eine gesperrte TThreadListe zuzugreifen? Kann es zu einem Problem werden, wenn der Thread, der die Liste gerade gesperrt hat, etwas länger braucht, z.B. wenn mehrere Tausend Einträge gelöscht werden müssen?

Zitat aus der Embarcadero-Wiki: "Sie können in einem TThreadList-Objekt ohne explizites Sperren von mehreren Threads Listenelemente hinzufügen oder entfernen."

Heißt dass, dass der Thread beim Versuch auf die gesperrte Liste weiterläuft oder wie ist es zu verstehen?

dummzeuch 3. Feb 2017 20:09

AW: TThreadList und das Verhalten von Threads?
 
Zitat:

Zitat von uups (Beitrag 1360784)
Hallo!

Wie verhalten sich die Threads, wenn die gerade versuchen auf eine gesperrte TThreadListe zuzugreifen? Kann es zu einem Problem werden, wenn der Thread, der die Liste gerade gesperrt hat, etwas länger braucht, z.B. wenn mehrere Tausend Einträge gelöscht werden müssen?

Zitat aus der Embarcadero-Wiki: "Sie können in einem TThreadList-Objekt ohne explizites Sperren von mehreren Threads Listenelemente hinzufügen oder entfernen."

Heißt dass, dass der Thread beim Versuch auf die gesperrte Liste weiterläuft oder wie ist es zu verstehen?

Nein, der Thread wird geblockt, wenn er nicht zugreifen kann.

himitsu 3. Feb 2017 21:21

AW: TThreadList und das Verhalten von Threads?
 
Bei Einzeloperationen (Add, Delete usw.) ist dort die Sperre bereits eingebaut,
also Critical Section ala
Delphi-Quellcode:
procedure TTThreadList.Add(Value: Typ);
begin
  Enter;
  try
    inherited Add(Value);
  finally
    Leave;
  end;
end;
Willst du mehrere Operationen machen, dann mußt/kannst/solltest du die Sperre der Liste verwenden, also vorallem bei Schleifen oder Prüfen-und-bei-Vorhandensein-zugreifen, da sich ja zwischendrin was an der Liste ändern könnte.

uups 3. Feb 2017 22:28

AW: TThreadList und das Verhalten von Threads?
 
Zitat:

Zitat von himitsu (Beitrag 1360791)
Willst du mehrere Operationen machen, dann mußt/kannst/solltest du die Sperre der Liste verwenden, also vorallem bei Schleifen oder Prüfen-und-bei-Vorhandensein-zugreifen, da sich ja zwischendrin was an der Liste ändern könnte.

Da geht es ja auch nicht anders, oder? Die eigentliche Liste ist privat deklariert und wird erst von
Delphi-Quellcode:
LockList
zur Verfügung gestellt.

himitsu 4. Feb 2017 01:42

AW: TThreadList und das Verhalten von Threads?
 
Hatte wohl mehr die Implementation der Queues/Stacks im Kopf.
Da sind die Push und Pop-Methoden direkt zugreifbar, also das Äquivalent für Append (Add) und Remove (Delete).

[Edit] Nein, passt doch.
Delphi-Referenz durchsuchenTThreadList.Add und Delphi-Referenz durchsuchenTThreadList.Remove
Add geht immer und Remove sollte ohne Lock natürlich nur verwendet werden, wenn man der einzige Thread ist, der dieses Item besitzt.


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