Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.962 Beiträge
 
Delphi 12 Athens
 
#1

TThreadedQueue vs ThreadedRingBuffer

  Alt Gestern, 12:39
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?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (Gestern um 12:57 Uhr)
  Mit Zitat antworten Zitat