Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Threads, TStringlist und CriticalSection (https://www.delphipraxis.net/112283-threads-tstringlist-und-criticalsection.html)

kng 18. Apr 2008 00:33


Threads, TStringlist und CriticalSection
 
Moin,

Ich habe ein Programm, das mehrere Threads startet, die auf eine globale TstringList zugreifen.
(Es wird nur gelesen, nicht gelöscht, eingefügt oder geschrieben.)
Funktioniert auch ganz gut.

Hier ein Beispiel, wie es bei mir ungefähr aussieht:
Delphi-Quellcode:
var list:tstringlist;

procedure mythread;
var i:integer; s:string;
begin
for i:=0 to pred(list.count) do
begin
  s:=list[i];
  //"s" verarbeiten
end;
end;

procedure startthreads;
var i:integer; c:cardinal;
begin
for i:=1 to 20 do
  beginthread(nil,0,@mythread,nil,0,c);
end;
"list" enthält ~ 20000 Einträge.
Dann habe ich gehört, dass ich ich die komplette For-Schleife in eine CriticalSection schreiben muss.

Ist das wirklich nötig?
Es funktioniert ja auch ohne... und würde den Vorgang doch eig. nur unnötig verlangsamen oder?

Oder können ohne CriticalSection sonst noch andere Probleme auftreten?

chaosben 18. Apr 2008 05:14

Re: Threads, TStringlist und CriticalSection
 
Zitat:

Zitat von Die Delphi-Hilfe ©Borland
Wenn der Schutz des globalen Speichers in einem kritischen Abschnitt implementiert wird, kann immer nur ein Thread auf den geschützten Speicher zugreifen. Ein solcher umfassender Schutz ist aber häufig gar nicht nötig. Ein typisches Beispiel dafür sind Objekte oder Variablen, auf die zwar viele Lesezugriffe durchgeführt werden, denen aber nur sehr selten ein Wert zugewiesen wird. Wenn mehrere Threads gleichzeitig Lesezugriffe auf denselben Speicherbereich ausführen, besteht keine Gefahr eines Konflikts. Kollisionen sind nur möglich, wenn ein Thread einen Schreibzugriff ausführt.

Siehe auch: TMultiReadExclusiveWriteSynchronizer-Objekte in der OH

kng 18. Apr 2008 11:21

Re: Threads, TStringlist und CriticalSection
 
Zitat:

Zitat von chaosben
Zitat:

Zitat von Die Delphi-Hilfe ©Borland
Wenn der Schutz des globalen Speichers in einem kritischen Abschnitt implementiert wird, kann immer nur ein Thread auf den geschützten Speicher zugreifen. Ein solcher umfassender Schutz ist aber häufig gar nicht nötig. Ein typisches Beispiel dafür sind Objekte oder Variablen, auf die zwar viele Lesezugriffe durchgeführt werden, denen aber nur sehr selten ein Wert zugewiesen wird. Wenn mehrere Threads gleichzeitig Lesezugriffe auf denselben Speicherbereich ausführen, besteht keine Gefahr eines Konflikts. Kollisionen sind nur möglich, wenn ein Thread einen Schreibzugriff ausführt.

Siehe auch: TMultiReadExclusiveWriteSynchronizer-Objekte in der OH

Vielen Dank, da bin ich beruhigt. :wink:


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