AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Synchronize unterbricht innerhalb einer CriticalSection
Thema durchsuchen
Ansicht
Themen-Optionen

Synchronize unterbricht innerhalb einer CriticalSection

Ein Thema von s.h.a.r.k · begonnen am 8. Okt 2008 · letzter Beitrag vom 9. Okt 2008
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Synchronize unterbricht innerhalb einer CriticalSection

  Alt 8. Okt 2008, 14:43
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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Synchronize unterbricht innerhalb einer CriticalSection

  Alt 8. Okt 2008, 18:15
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Synchronize unterbricht innerhalb einer CriticalSection

  Alt 8. Okt 2008, 18:38
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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Synchronize unterbricht innerhalb einer CriticalSection

  Alt 8. Okt 2008, 19:32
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;
...
Jan
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#5

Re: Synchronize unterbricht innerhalb einer CriticalSection

  Alt 8. Okt 2008, 19:35
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.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Synchronize unterbricht innerhalb einer CriticalSection

  Alt 9. Okt 2008, 10:05
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:46 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