Announcement

Collapse
No announcement yet.

verschachtelte TCriticalSection mit Borland C++ 2006

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • verschachtelte TCriticalSection mit Borland C++ 2006

    Hallo

    Ich (Wir) arbeiten an einer Multithreaded Applikation mit Borland C++ Builder 2006. Dabei gibt es einen Background Thread der gewisse Tasks abarbeitet. Diese Tasks werden dem Thread von einem anderen Thread übermittelt.

    Zur Synchronisation benutze ich dazu relativ ausgiebig die Klasse TCriticalSection (ich benutze dazu eine Instanz von TCriticalSection welche über eine Singleton Klasse an die Methoden/Klassen zurückgegeben wird, um gewisse Codeabschnitte zu sichern.

    Leide habe ich in meiner Applikation nun einen Deadlock, den ich nicht verstehe. Wenn ich nichts übersehen habe wird jede kritische Codesektion die mit einem Enter() Statement beginnt auch wieder released (Leave). Evtl. verstehe ich die Handhabung/Funktion von TCriticalSection noch nicht ganz. Darum hier ein paar Fragen anhand des untenstehenden Code-Snippets:


    TcriticalSection criticalSection;

    void Methode1{
    criticalSection.Enter();
    Methode2();
    criticalSection.Leave();
    }


    void Methode2{
    criticalSection.Enter();
    ...
    criticalSection.Leave();
    }


    1. sind verschachtelte criticalSections möglich? (benutze ich in meinem Code)
    Falls ja, wo muss man speziell Acht geben?
    2. in obigem Beispiel wird in Methode1 wird nach dem Enter-Statement Methode1 aufgerufen in der wiederum ein Enter-Statement aufgerufen wird und anschliessend ein Leave Statement.
    2a: Was bewirkt das 2. Enter Statment (gar nichts da ja schon in einer kritischen Sektion / das locking wird verstärkt (a la semaphoren), dass heisst jetzt müssen 2. Leave statements folgen damit andere threads auf kritische Bereiche (von dieser TCriticalSection beschützt) zugreifen können.
    2b: Was macht das Leave-Statement in Methode2
    - es hebt nur das Enter-Statement von Metode2 auf
    - es hebt das alle EnterStatements auf (Methode1+2), Was macht dann das Leave-Statement in Methode1
    3. Wo kann es sonst noch Deadlocks geben. Ich denke gemenisame Resourchen sind nur das gesharte Memory (das ja eben geschützt werden sollte) und allenfalls die Datenbank (aber hier gibt es ja einen TimeOut)

    In Bezug auf C++ bin ich leider noch recht grün hinter den Ohren und dankbar für jede Hilfe

    Gruss Dani

  • #2
    Das ist nun das dritte gleiche Posting hier. Nr1 habe ich gelöscht.

    Warum??
    Christian

    Comment


    • #3
      Hi

      Hab wohl meinen Kopf nicht ganz bei der Sache. Wollte es eigentlich unter C++ Builder posten, aber denke dort wäre es auch fehl am Platz. Ich habe die bisherigen Forumseinträge relativ lange durchsucht, und keine Antworten oder gleichlautende Fragen gefunden. Wo könnte ich sonst noch Antworten auf meine Frage finden?

      PS: Von mir aus kannst du die mehrfachen Beiträge löschen. Das war ein Versehen.

      Comment


      • #4
        Hi

        Noch ein kleiner Nachtrag falls sich jemand diesem Thema annehmen sollte. Hier sind meine Annahmen zu TCriticalSections (ich denke diese stimmen, 100% bin ich mir aber nicht)

        1. Eine Instanz von TCriticalSection schützt gewisse Codebereiche so, dass in Diesen codeAbschnitten nur ein Thread sein kann. Untenstehendes Beispiel könnte also einen Deadlock verursachen die beiden Instanzen sich gegenseitig blockieren da jede Instanz von TCriticalSection nur die eigenen Bereiche (zwischen Enter und Leave) schützt.

        2. Ene kritische Sektion kann sehr wohl von einem anderen Thread unterbrochen werden. (Anders als z.B. synchronised methoden in JAVA wenns mir recht ist). Es können einfach nicht mehrere Threads in einer kritischen Methode sein. Darum muss man Write und Read-Zugriffe synchronisieren.


        Beispiel:

        TCriticalSection eins;
        TCriticalSection zwei;

        void Methode1(){

        eins.Enter();
        Sleep(100000);
        zwei.Enter();
        zwei.Leave();

        eins.Leave();
        }


        Methode2(){
        zwei.Enter();
        Sleep(20000);
        eins.Enter();
        eins.Leave();
        zwei.Leave();
        }


        Thread1:

        Methode1();
        Methode2();


        Thread2;
        Methode2();
        Methode1();
        Zuletzt editiert von knoepdan; 24.08.2007, 14:50.

        Comment


        • #5
          aber denke dort wäre es auch fehl am Platz
          Aha, aber in einem thematisch völlig falschen Frum ist es richtig?

          Denke hier ist es besser
          Christian

          Comment


          • #6
            Hi

            Habe im übrignes den Grund für meinen deadlock herausgefunden. Habe einmal mehr leave aufgerufen als enter:

            criticalSection.Enter();
            criticalSection.Leave();
            criticalSection.Leave();

            criticalSection.Enter(); // deadlock da leave vorher 2mal aufgerufen wurde



            Diese erkenntnis löst mehr oder weniger mein Problem. Trotzdem wäre es schön zu wissen was genau es mit TCriticalSections auf sich hat. Irgendwelche Links?

            Gruss und schönes Weekend

            Comment


            • #7
              ja, die Hilfe zu Release und Acquire
              Christian

              Comment


              • #8
                Sorry aber die Borland Hilfe erklärt diese Hilfe nur zum Teil

                Comment


                • #9
                  kann ich so nicht bestätigen
                  Christian

                  Comment

                  Working...
                  X