Wie sieht es nun aus, wenn ein Thread das Synchronize ausführt und darin das LockList durchführt und nun ein anderer Thread auch das Synchronize ausführen will.
Wartet da der zweite thread darauf, dass der erste die Sync Procedure wieder verlassen hat oder kann es hier einen Deadlock führen?
Deadlock gibt es nicht ... weil das Locken auch nichts bringt.
Eine CriticalSection darf unter der gleichen ThreadID sooft betreten werden wie man lustig ist.
Und wenn der Aufruf per Sync erfolgt, dann befindest du dich im Kontext von MainThreadID!
Somit bringt dir die CriticalSection da nix ausser verschwendete Bytes im Source und Code.
Wer es nicht glaubt
das geht und wird auch immer brav aufgerufen
Delphi-Quellcode:
procedure RemoveData(Data : Pointer);
var
List : TList;
i : Integer;
begin
// Da aus dem Thread mit Sync aufgerufen wird
// ist diese Bedingung immer erfüllt
// und kann daher auch entsorgt werden
if MainThreadID = GetCurrentThreadID then
begin
for i := 0 to List.Count - 1 do
begin
if List[i] = Data then
begin
List.Delete( i );
// Hier noch der Aufruf zur Aktualisierung des Memos
end;
end;
end;
end;
Es ist auch immer hilfreich an gewissen Stellen mit OutputDebugString oder dem Schreiben einer Log-Datei oder mit einem Haltepunkt im Debugger die Statuswerte zu prüfen.
(z.B. GetCurrentThreadID und MainThreadID
)