TThreadedQueue aus System.Generics.Collections
Führt bei jedem PushItem oder PopItem sowas hier durch
Delphi-Quellcode:
TMonitor.Enter(FQueueLock); // ALLES WIRD GELOCKT
try
Result := wrSignaled;
while (Result = wrSignaled) and (FQueueSize = Length(FQueue)) and not FShutDown do
if not TMonitor.Wait(FQueueNotFull, FQueueLock, FPushTimeout) then
Result := wrTimeout;
if FShutDown or (Result <> wrSignaled) then
Exit;
FQueue[(FQueueOffset + FQueueSize) mod Length(FQueue)] := AItem;
Inc(FQueueSize);
Inc(FTotalItemsPushed);
finally
AQueueSize := FQueueSize;
TMonitor.Exit(FQueueLock);
end;
TMonitor.Pulse(FQueueNotEmpty);
Wenn ich Queue als Ringpuffer umsetzen würde , müsste ich dann immer noch beides LOCKEN also READ und WRITE oder kann ich READ während des WRITE ungelockt lassen ?
Edit:
Ich sehe gerade DASS es sich bei TThreadedQueue um einen Ringbuffer handelt.
Warum wird jedesmal alles gelockt?