AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Critical Sections

Ein Thema von Sämy · begonnen am 7. Jan 2008 · letzter Beitrag vom 7. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#1

Critical Sections

  Alt 7. Jan 2008, 13:50
Ich hab nur ne kurze Frage:

Wieso endet dies in einer Endlosschleife:

Delphi-Quellcode:

FCs := TCriticalSection.Create;

procedure test;
begin
  FCs.Enter;
  test;
  FCS.Leave;
end;
Meiner Meinung nach sollte dies ein Dead-Lock ergeben. Oder habe ich da was falsch verstanden?
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Critical Sections

  Alt 7. Jan 2008, 13:54
1. Endlosschleife: weil du dich immer wieder selber aufrufst
2. kein dead lock, da es die selber Critical Section ist. So oft wie du sie betrittst musst du sie auch wieder verlassen. Es ist keine neue critical section sondern die gleiche...
  Mit Zitat antworten Zitat
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Critical Sections

  Alt 7. Jan 2008, 13:57
Ok, dann blockiert eine Criticalsection also nur andere Prozesse, während dessen der, der die Criticalsection als erstes betritt, diese noch weitere Male betreten kann?

Dh. der folgende Code ist Threadsafe?

Delphi-Quellcode:

destructor Destroy;
begin
  FCs.Enter;

  if FDestroying then
    Exit;

  FDestroying := true;
  
  [...] (<-- Hier drin wird diese Destroymethode abermals aufgerufen)

  inherited;

  FCS.Leave;
end;
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Critical Sections

  Alt 7. Jan 2008, 14:40
Zitat von Sämy:
Ok, dann blockiert eine Criticalsection also nur andere Prozesse, während dessen der, der die Criticalsection als erstes betritt, diese noch weitere Male betreten kann?
Es geht nicht um den Aufrufer sondern um die Critical Section. Lege jedesmal in deinem ersten Beispiel eine neue Instanz an und du bekommst den Dead Lock.

Ich kapiere grundsätzlich nicht, warum man einen Destruktor mehrfach aufrufen sollte. Der Destruktor ist genauso wieder Konstruktor eine spezielle Methode und von daher solltest du deine Critical Sections und Sicherheiten nicht im Destruktor bauen sondern ausserhalb in einer Methode und dann entsprechend der Bedingungen einmalig den Destruktor aufrufen.

Du kannst mit einem Exit einen aufgerufenen Destruktor schlecht rückgängig machen bzw. abbrechen. Das ist in so fern schon eine schlechte Wahl der Programmierung. Bau dir eine Methode (nenne sie z.B. FreeInstance) und baua dort deine Critical Sections und wenn die Instanz dann wirklich weg kann/soll, dann rufe dort den Destruktor auf.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Critical Sections

  Alt 7. Jan 2008, 14:52
eine CriticalSection sorgt dafür das ein THREAD am CriticalSection.Enter so lange wartet bis kein anderer Thread mehr in der CriticalSection ist (andere Threads also mit CriticalSection.Leave die CriticalSection verlassen haben)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Critical Sections

  Alt 7. Jan 2008, 15:28
Delphi-Quellcode:

So: ?

procedure test;
begin
  FCs := TCriticalSection.Create;
  FCs.Enter;
  test;
  FCS.Leave;
end;
[/delphi]
Dies Funktioniert nicht (kein Deadlock)

Das mit dem Doppel-destroy seh ich ein. Gibt Probleme, wenn jemand diese Methode überschreiben will...
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Critical Sections

  Alt 7. Jan 2008, 15:44
Zitat von Sämy:
Dies Funktioniert nicht (kein Deadlock)
Ja, da habe ich Müll erzählt - wie SirThornberry schon richtig erwähnte, orientiert sich die Critical Section an dem aktuellen Thread anstatt der Instanz.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Critical Sections

  Alt 7. Jan 2008, 15:48
ergibt das aber nicht eine Endloserekursion bis hinn zum Stacküberlauf wenn Test immer wieder sich selbst aufruft?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Sämy

Registriert seit: 4. Nov 2004
Ort: Basel (CH)
76 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Critical Sections

  Alt 7. Jan 2008, 16:25
Dies war auch nur ein Test-Case. Ich dachte, dass eine Critical-Section absolut gesperrt wird. Sprich wenn sich die Funktion selbst aufruft, sollte ein Deadlock resultieren und keine Endlosschleife. (Meine Frage war, wieso dies nicht funtioniert)

Noch mals zu meinem Handling in der Destroy-Methode. Wie soll ich dies lösen?

Szenario:
Eine Objekt registriert sich in einer Liste.
Wenn es zerstört wird, so trägt es sich wieder aus der Liste aus.
Es werden jedoch alle Objekte in der Liste, wenn sie sich austragen, gelöscht. (-> Erneutes Aufrufen der Destroy-Methode)
Jetzt müsste ich, wenn ich das Handling des Zerstörens an einem anderen Ort als in der Destroy-Methode machen würde, von jedem Objekt, welches sich in der Liste registriert, eine bestimmte Funktion voraussetzen. Das will ich jedoch nicht.
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
  Mit Zitat antworten Zitat
noidic

Registriert seit: 21. Nov 2005
Ort: Mönchengladbach
25 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Critical Sections

  Alt 7. Jan 2008, 16:31
Sind all diese Objekte in einer Liste? Dann nimm das entfernen aus der Liste aus dem Destructor heraus und rufe nie destroy auf, sondern gehe immer den Weg über das entfernen aus der Liste.
The light at the end of the tunnel may be an oncoming dragon.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:38 Uhr.
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