Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TThreadList.LockList (https://www.delphipraxis.net/9734-tthreadlist-locklist.html)

DataCool 2. Okt 2003 17:01


TThreadList.LockList
 
Hi Leute,

zwei Fragen beide zu TThreadList.LockList :

1. Was passiert wenn ein Thread die ThreadList mit Locklist gesperrt hat und ein anderer Thread kurz danach die Liste speeren will ? Warte der dann solange bis die Liste wieder entsperrt ist ?

2. Wenn ich irgentwo in meinem Sourcecode zum LockList das unlock vergessen habe, wie verhalten Sie dann die anderen Threads die auf diese Liste zugreifen wollen ? Gibt's für die Sperrung eine Art Sicherheits-Timeout ?
Oder einmal gesperrt und nicht freigegeben = nicht erreichbar für die anderen Threads ?

Gruß Data

Luckie 2. Okt 2003 17:50

Re: TThreadList.LockList
 
Zu 1.) Ein Thread kann nur etwas sperren, wenn er Zugriff darauf hat, da das Objekt gesperrt ist, kann der zwiete Thread nicht draufzugreifen und es sperren.

Zu 2. würde ich sagen, dann hast du dir ein Deadlock gebaut. Sprich alle Threads, die auf deine Liste zugreifen wollen, warten sich zu tode.

Beides sagt mir eigentlich mehr mein gesunder Programmiererverstand.

DataCool 2. Okt 2003 19:45

Re: TThreadList.LockList
 
Hi Luckie,

es geht mir um folgenden Source :

Code:
procedure TUserList.Clear;
Var i : Longint;
      tmpUser : TUser;
      TmpList : TList;
begin
   TmpList := fTL.LockList;
   try
      for i:= 0 to TmpList.Count - 1 do begin
         if TmpList[i] <> Nil then begin
            tmpUser := TUser(TmpList[i]);
            tmpUser.Free;
            TmpList[i] := Nil;
         end;
      end;
      TmpList.Pack;
   finally
      fTL.UnlockList;
   end;
end;
Genauso wird aus einen anderen Thread :

Code:
procedure TUserList.Delete(user: TUser);
begin
   ftl.Remove(user);
   if user <> nil then
      user.free;
end;
Worum es mir bei Frage 1 ging ist :
was passiert wenn aus Thread 1 clear aufgerufen wird und Thread 2 delete aufruft, obwohl Thread 1 mit clear noch nicht fertig ist. Ist die Liste von Thread 1 noch gelockt, wie reagiert Thread 2 ?
Das Remove versucht ja auch die Liste zu sperren ! Wird der Eintrag dann entfernt ? Wartet der Zeit solange bis er die Liste sperren kann und macht dann weiter ?

Gruß Data

Christian Seehase 2. Okt 2003 21:37

Re: TThreadList.LockList
 
Moin DataCool,

warum schaust Du Dir nicht die internen Abläufe in der Unit classes.pas an? ;-)
Die müsste bei Deiner Enterprise Version dabei sein.

Um's kurz zu machen:
LockList ruft intern EnterCriticalSection auf und sperrt damit die Liste.
Remove versucht das auch indem die Methode LockList aufruft, und muss warten, bis die Liste wieder freigegeben ist.


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