![]() |
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 |
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. |
Re: TThreadList.LockList
Hi Luckie,
es geht mir um folgenden Source :
Code:
Genauso wird aus einen anderen Thread :
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;
Code:
Worum es mir bei Frage 1 ging ist :
procedure TUserList.Delete(user: TUser);
begin ftl.Remove(user); if user <> nil then user.free; end; 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 |
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 10:59 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-2025 by Thomas Breitkreuz