Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Änderungen von Variablen synchronisieren (https://www.delphipraxis.net/167197-aenderungen-von-variablen-synchronisieren.html)

Breager 19. Mär 2012 21:53

AW: Änderungen von Variablen synchronisieren
 
Zitat:

Zitat von Sir Rufo
Erklär doch mal, wofür du das MustLock in LockList und UnlockList jeweils veränderst. Das macht in meinen Augen keinen Sinn.

Wenn ich die CriticalSection über TMyList.Locklist starte, würde z.B. innerhalb von TMyList.Count ein erneuter Versuch, die CriticalSecion zu starten eine Ausführung des Codes in TMyList.Count blockieren.

Aus diesem Grund setze ich bei TMyList.Locklist MustLock:=False. Das bedeutet, dass ich z.B. innerhalb von Count keine CriticalSection mehr starten muss, da schon aktiv
Delphi-Quellcode:
IF MustLock then Lock
Also wird der Code in Count ausgeführt.

Sir Rufo 19. Mär 2012 22:29

AW: Änderungen von Variablen synchronisieren
 
Ja, sowas hatte ich mir gedacht :)

Aber das ist überflüssig und verkompliziert die Sache unnötig.

Eine CriticalSection sorgt dafür, das innerhalb selbiger nur ein ThreadKontext aktiv ist.
Innerhalb dieses ThreadKontextes kann eine CS aber beliebig oft betreten werden.
Die CS muss aber auch genauso oft wieder verlassen werden damit diese wieder frei für einen anderen ThreadKontext ist.
Delphi-Quellcode:
FCS.Enter;
FCS.Enter;
  TuWas;
FCS.Leave;
FCS.Leave;
Diese Konstrukt funktioniert problemlos, denn wenn die CS betreten werden kann, dann funktioniert auch das zweite Betreten.

Breager 19. Mär 2012 22:40

AW: Änderungen von Variablen synchronisieren
 
Alles klar :thumb: Danke, man lernt eben nie aus. Das Thema Threads wird mir noch die ein oder andere schlaflose Nacht bescheren (absolutes Neuland für mich) :roll:

himitsu 19. Mär 2012 22:54

AW: Änderungen von Variablen synchronisieren
 
Und das Try-Finally nicht vergessen, denn die CS muß eben unbedingt genau so oft verlassen/freigegeben werden, wie sie betreten/gesperrt wurde.

Breager 20. Mär 2012 00:16

AW: Änderungen von Variablen synchronisieren
 
Zitat:

Zitat von himitsu
Und das Try-Finally nicht vergessen, denn die CS muß eben unbedingt genau so oft verlassen/freigegeben werden, wie sie betreten/gesperrt wurde.

Ja, das habe ich jetzt konsequent in jeder Function und Procedure, wie beim Beispiel von Count, eingebaut:
Delphi-Quellcode:
Function TMyList.Count:Integer;
Begin
 lock;
 try
  Result:=MyList.Count;
 finally
  unlock;
 end;
End;

Furtbichler 20. Mär 2012 06:27

AW: Änderungen von Variablen synchronisieren
 
Und das 'lock' bzw. 'unlock' sieht wie aus?

Blup 20. Mär 2012 07:21

AW: Änderungen von Variablen synchronisieren
 
Zitat:

Zitat von Breager (Beitrag 1157417)
Delphi-Quellcode:
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;

Wenn Thread1 Locklist aufgerufen hat und die Liste bearbeitet, kann Thread2 im Lock am FCS.Enter vorbei und die Liste ebenfalls zur gleichen Zeit bearbeiten.
:stupid: :pale: :oops:

himitsu 20. Mär 2012 07:46

AW: Änderungen von Variablen synchronisieren
 
Wozu das MustLock?

Erstmal das von Blup Genannte
und wenn sich zwischen Lock und Unlock das MustLock ändert, dann stimmt die Anzahl auch nicht mehr.


Im Prinzip ist das LockList/UnlockList umsonst, außerdem fehleranfällig und Lock/Unlock alleine reicht auch schon aus.

Breager 20. Mär 2012 17:11

AW: Änderungen von Variablen synchronisieren
 
Zitat:

Zitat von himitsu
Im Prinzip ist das LockList/UnlockList umsonst, außerdem fehleranfällig und Lock/Unlock alleine reicht auch schon aus.

Der Gedanke dahinter war, dass ich bei Bedarf Codeabschnitte einschließen kann.
Delphi-Quellcode:
MyList.Locklist;
Dateiinfo:=Leseausdatei(MyList.Item[5].FileName); //Leseausdatei ist kein Bestandteil der Klasse
//Was passiert, wenn während der Leseausdatei Function gleichzeitig das MyList.Item[5] über MyList.Delete(5) gelöscht wird.
Mylist.Item[5].Daten:=Dateiinfo; //Daten werden in falschen Item gespeichert.
MyList.LockList;
Sir Rufo hat mich schon darauf hingewiesen, dass das Mustlock überflüssig ist.

EDIT:
Zitat:

Zitat von himitsu
und wenn sich zwischen Lock und Unlock das MustLock ändert, dann stimmt die Anzahl auch nicht mehr.

Mustlock kann doch garnicht geändert werden, da Private

himitsu 20. Mär 2012 17:13

AW: Änderungen von Variablen synchronisieren
 
Das geht ja dennoch.
Delphi-Quellcode:
MyList.Lock;
try
  Dateiinfo:=Leseausdatei(MyList.Item[5].FileName); //Leseausdatei ist kein Bestandteil der Klasse
  //Was passiert, wenn während der Leseausdatei Function gleichzeitig das MyList.Item[5] über MyList.Delete(5) gelöscht wird.
  Mylist.Item[5].Daten:=Dateiinfo; //Daten werden in falschen Item gespeichert.
finally
  MyList.Unlock;
end;
Wenn du Mustlock entfernst, wirst du bemerken, daß Lock=LickList und Unlock=UnlockList.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz