Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#6

Re: TList in Thread synchronisieren (CriticalSection)

  Alt 2. Feb 2010, 10:42
Jupp, TList ist nicht threadsicher.

(Wenn auf irgendwas nur innerhalb irgendeines Threads und nur in diesem, zugegriffen wird, dann muß man nichts absichern)


PS: um Daten einer Liste abzuarbeiten, hatt ich mir mal dieses gebastelt
http://www.delphipraxis.net/internal...t.php?t=167796

Zitat:
Das Problem war nun, dass beim Aufruf von z.B. AddData() der Main Thread dauerhaft blockiert wurde, die CriticalSection im Thread also scheinbar nie released wurde.
erstmal der Resourcen-Schutzblock:
Delphi-Quellcode:
while not Terminated do
begin
  CS.Enter;
  try
    for I := 0 to FList.Count - 1 do
    begin
      // blabla ..
    end;
  finally
    CS.Leave;
  end;
end;
Denn wenn etwas passiert (z.B. eine Exception), dann wird da wirklich kein .Leave aufgerufen.

Und dann rufst du praktisch direkt nach dem .Leave fast sofort wieder .Enter auf.
Wenn also hier Windows nicht rein zufällig an dieser Stelle eine Pause einlegt und den anderen Threads so überhaupt die Möglichkeit gibt hier einzusteigen, dann kann auch nie ein anderer Thread an der Stelle die CS "übernehmen".

Delphi-Quellcode:
while not Terminated do
begin
  CS.Enter;
  try
    for I := 0 to FList.Count - 1 do
    begin
      // blabla ..
    end;
  finally
    CS.Leave;
  end;
  Sleep(0);
end;
0 gibt nur für einen "Zyklus" die Kontrolle ab,
so daß die anderen Threads überhaupt 'ne Chance bekommen.
Unter Umständen könnte hier aber auch eine noch längere Pause hilfreich sein.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat