![]() |
TList<T>, TQueue<T>, TDictionary<T> Thread
Hallo,
sind die oben genannten Typen threadsafe, wenn man nur lesen drauf zugreift? Z.b. mit einer Schleife alle Eintraege durchlaufen. Grueße, Win32.API |
Re: TList<T>, TQueue<T>, TDictionary<T> Th
So lange du nur lesend Zugriff auf eine Datenstruktur hast ist diese - außer die Implementierung ist nicht gut und schreibt z.B. in Variablen der Klasse/Unit und nicht in lokale Variablen auf dem Stack - immer Threadsicher.
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Genau, da ich aber den Source fuer die Generics nicht besitze wuerde ich es gerne von jemandem bestaetigt haben, der sich damit schon mal auseinander gesetzt hat.
Grueße, Win32.API |
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
TList etc. verwalten intern ein Array. Beim (lesenden) Zugriff auf "Items" wird nur der Inhalt des Arrays zurückgegeben, sonst wird nichts gemacht. Lesender Zugriff auf TList und Verwandte davon ist Threadsicher.
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
Zitat:
Grueße, Win32.API |
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
Wenn dein Thread die TList exklusiv verwendet ist das kein Problem. Wird die TList allerdings von zwei Threads verwendet... Ich habe die Implementierung momentan nicht vor mir liegen, aber TList wird nicht beim Zugriff gesperrt. Da die Liste vermutlich auch mit Elementen gefüllt wird (sonst ist sie sinnlos), muss also irgendetwas auch schreibenden Zugriff haben. Und wenn dieses Etwas zufällig ein Element entfernt, während der Thread liest, dann heißt es Daumen drücken. Dafür gibt es extra eine Implementierung von TThreadList, welche intern eine TList verwendet und bei Zugriffen sperrt. Zitat:
Aber das wird Win32.API sicherlich nicht in der Arbeit verwenden. :} |
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Stimmt, allerdings war ich auch in Gedanken nur bei dem Wort Code und nicht Generic. :shock:
Dann bin ich mir garnicht sicher, ob das auf meine Aussage bzgl. TList zutrifft. Hier geht es ja um Generic. :mrgreen: :wall: Ich muss mal mein Delphi wieder aktualisieren, bei D2005 gibt's keine Generics. |
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
Zitat:
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
Zitat:
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Naja, die Frage war ja eindeutig nur auf lesenden Zugriff gestellt - und solange auf gemeinsam genutzen Speicher kein Schreibzugriff erfolgt, ist solcher Code immer Threadsicher.
TThreadList ist für gemischt lesenden/schreibenden Zugriff gedacht. Und ich persönlich sehe in folgendem Codeabschnitt von TList keinen einzigen schreibenden Zugriff auf irgendeinen Speicherbereich:
Delphi-Quellcode:
Also wiederhole ich nochmal: Solange mehrere Threads ausschließlich lesenden Zugriff auf TList haben, ist das Threadsicher. TThreadList wird nur benötigt, wenn irgendein Thread gleichzeitig in die Liste schreibt.
function TList.Get(Index: Integer): Pointer;
begin if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index); Result := FList^[Index]; end; |
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
|
Re: TList<T>, TQueue<T>, TDictionary<T> Th
Zitat:
Danke fuer die zahlreichen Antworten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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 by Thomas Breitkreuz