Einzelnen Beitrag anzeigen

Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#16

AW: Änderungen von Variablen synchronisieren

  Alt 19. Mär 2012, 17:48
Zitat von himitsu:
Beim Pollen muß meventuell an aufpassen, daß man nicht die CPU hochtreibt.
Ich bei da Pausen in die Schleife, so mit je um die 20 Millisekunden.
Aber dort kann man sich unter umständen auch aussperren, wenn zwei/mehrere Threads in schneller Follge drauf zugreifen und zwischen 2 Zugriffen die Zeit kürzer ist, als die Pause.
Da reicht sogar schon eine Millisekunde aus Hatte ich die letzten Tage mal selbst getestet. Hatte das ganz falsch verstanden. Dachte, das Enter wartet genauso wenig wie das TryEnter. Habs jetzt erstmal ohne Pollen umgesetzt.

Und zwar habe ich mir eine einfache threadsichere Klasse (mit CriticalSections) gebaut, die sich um alles kümmert. Ich weiss, dafür gibts die ThreadList, die fand ich von der Schreibarbeit jedoch auch nicht wesentlich angenehmer. In meiner Klasse überlasse ich es dem Benutzer, ob er die Liste manuell sperren möchte oder ob dies automatisch geschieht.
Delphi-Quellcode:
interface
Uses Classes, SysUtils, SyncObjs;
type

  TMyList = class
    private
      MyList:TList;
      FCS : TCriticalSection;
      MustLock:Boolean; //Liste muss gesperrt werden
      Procedure Lock; //Internes Sperren
      Procedure Unlock; //Internes Freigeben

    public
      Procedure Locklist; //Manuell sperren
      Procedure Unlocklist; //Manuell freigeben

      Constructor Create;
      Destructor Destroy;
      Function Count:Integer;
      ...
   end;

implementation

Constructor TMyList.Create;
Begin
  MyList:=TList.Create;
  FCS := TCriticalSection.Create;
  MustLock:=True; //Liste muss automatisch gesperrt werden
End;

Procedure TMyList.Lock;
Begin
IF MustLock then
   FCS.Enter;
End;

procedure TMyList.Unlock;
begin
IF MustLock then
   FCS.Release;
end;


Procedure TMyList.Locklist;
Begin
 FCS.Enter;
 MustLock:=False; //Liste muss später NICHT automatisch gesperrt werden
End;

Procedure TMyList.Unlocklist; //EDIT: Reihenfolge der Codezeilen wurde getauscht
Begin
  MustLock:=True; //Liste muss später automatisch gesperrt werden
  FCS.Release;
End;

Function TMyList.Count:Integer;
Begin
 lock;
 try
  Result:=MyList.Count;
 finally
  unlock;
 end;
End;
Der Vorteil hierbei ist, dass man bei Bedarf einen größeren Code-Block sperren kann, ansonsten muss ich mich um nichts kümmern.

Mal noch ne letzte Frage, wenn man in einer Schleife mehrere Items aus der Liste löscht, ist es dann besser, die komplette Schleife zu sprerren oder nur die einzelnen Delete?

Geändert von Breager (19. Mär 2012 um 18:16 Uhr)
  Mit Zitat antworten Zitat