Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Synchronize unterbricht innerhalb einer CriticalSection (https://www.delphipraxis.net/122032-synchronize-unterbricht-innerhalb-einer-criticalsection.html)

s.h.a.r.k 8. Okt 2008 14:43


Synchronize unterbricht innerhalb einer CriticalSection
 
hallo erst mal,

und zwar stehe ich zurzeit vor dem folgenden problem: ich habe eine log-klasse, welche ich im hauptthread erzeuge. in dieser habe ich eine methode, welche nur von einem thread gleichzeitig ausgeführt werden darf, da diese über kritische sektionen geschützt ist.

nun kann thread2 eben über die entsprechende methode diese methode auch aufrufen und eben in ein listview und eine datei loggen.

mein problem tritt nun auf, wenn thread1 (=hauptthread) einen fehler meldet, d.h. die kritische sektion der log-klasse betritt und gleichzeitig thread2 ein synchronize aufruft. in der synchronisierten methode rufe ich ebenfalls den log-befehl auf und was passiert: es wird unendlich gewartet, da die ausführung von thread1 unterbrochen wurde und somit die kritische sektion nicht mehr verlassen wurde.

ist das ein generelles problem, das ich irgendwie umgehen muss, oder gibt es für sowas eine abhilfe?

mit freundlichen grüßen
pfäffle armin

sirius 8. Okt 2008 18:15

Re: Synchronize unterbricht innerhalb einer CriticalSection
 
Verschiedene Synchronisationsmethode mischen kanntödlich sein. Da sollte man zumindest genau wissen, was die machen.

Erhlich gesagt, habe ich dein Problem im speziellen nicht ganz verstanden. Du hast also mindestens 3 Threads: den MainThread und 2 weitere Threads (thread1 und thread2). Soweit richtig? Thread2 geht über synchronize ind die CS und Thread1 geht direkt in die CS.

s.h.a.r.k 8. Okt 2008 18:38

Re: Synchronize unterbricht innerhalb einer CriticalSection
 
ich glaube, dass es die mischung macht :( weil dieses problem an sich ziemlich allgemein sein kann.

allgemeine (und hoffentlich bessere) fassung:
und zwar habe ich zwei threads, thread1 und thread2. von mir aus kann auch thread1 der hauptthread sein, spielt aber an sich keine rolle.
nun habe ich eine methode in thread1, welche public ist, d.h. auch von anderen threads aus aufrufbar sein soll. wenn ich diese methode betrete, dann tritt der thread, welcher diese ausführt in eine criticalsection ein und beim verlassen der methode gibt es diese wieder frei, also wie folgt:
Delphi-Quellcode:
procedure methode();
begin
  FCriticalSection.Enter();
  try
    { ... }
  finally
    FCriticalSection.Leave();
  end;
end;
nun rufe ich in thread2 die methode von thread1 auf, aber eben synchronisiert:
[delphi]{ irgendwo in thread2 }
Synchronize(Thread1.methode);[/delpih]
klar ist, dass in thread1 eine referenz auf thread2 liegt.

nun gibt es den fall, dass eben das synchronize in thread2 zeitlich so dumm aufgerufen wird, dass die sequentielle abarbeitung des codes in thread1 genau dann abbricht, wenn thread1 in der criticalsection ist, d.h. thread2 wartet darauf, dass thread1 die criticalsection wieder verlässt, was ja aber nicht gehen kann, da dieser ja "steht".

ich hoffe, ich habe mein problem nun besser beschrieben ;)

btw: wenn ihr nun meint, dass dieses beispiel ja schwachsinn sei, dann kann ich auch gerne mein komplexeres problem, wie ich es im moment habe, darstellen. allerdings glaube ich nicht, dass ich dabei auf dem weg der besserung bin. es wird ein allgemeines problem bleiben, welches ich irgendwie umschiffen muss, wie mir scheint. die frage ist nur wie!?

da dieses problem im nachhinein an sich etwas klarer scheint, d.h. dieses problem eigentlich immer auftreten kann, da die struktur criticalsection dieses problem nicht umgeht, benötige ich wohl keine lösung dafür, da dies zu spezifisch wäre. soweit meine gedanken dazu ;)

Mr_G 8. Okt 2008 19:32

Re: Synchronize unterbricht innerhalb einer CriticalSection
 
Müsste man in dem Fall nicht verhindern, dass der Thread, der die Funktion aufruft, unterbrochen wird?
Das ginge doch dann, indem man die CS innerhalb des entsprechenden Threads betritt:
Delphi-Quellcode:
...
FCriticalSection.Enter();
try
  ...
  methode();
  ...
finally
  FCriticalSection.Leave();
end;
...

Uwe Raabe 8. Okt 2008 19:35

Re: Synchronize unterbricht innerhalb einer CriticalSection
 
Wenn ich nicht total daneben liege, dann funktioniert Synchronize nur mit dem Haupt-Thread. Ein Synchronisieren zwischen zwei Nicht-Haupt-Threads muss anders gelöst werden.

Abgesehn davon, habe ich dein Problem leider immer noch nicht richtig verstanden. Kannst du mal irgendwie deutlich machen, wer wann was aufruft und wie es zu dem Deadlock kommt? Etwas mehr Code wäre sicher hilfreich.

sirius 9. Okt 2008 10:05

Re: Synchronize unterbricht innerhalb einer CriticalSection
 
Zitat:

Zitat von s.h.a.r.k
von mir aus kann auch thread1 der hauptthread sein, spielt aber an sich keine rolle.

Das ist schon ziemlich entscheidend. Synchronize synchronisiert nämlich ausschließlich nur mit dem Hauptthread.

Ansonsten hast du irgendetwas innerhalb der critical section stehen (z.B. ein Application.Processmessages), was den Deadlock dann quasi direkt aufruft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:08 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