Einzelnen Beitrag anzeigen

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