Warum ist das kein Deadlock?



  • Hallo,

    eigentlich wollte ich nur mal zum Testen einen Deadlock produzieren, aber irgendwie haut das nicht hin.
    Code sieht ungefähr so aus:

    extern CCriticalSection csSection;
    
    DWORD Class::function()
    {
        CSingleLock lock( &csSection, false);
    	while( true)
    	{
               lock.Lock();
               Class::function2();
               lock.Unlock(); 
            }
    }
    
    int Class:function2()
    {
        CSingleLock lock( &csSection, false);
        lock.Lock();
          //mache irgendwas
        lock.Unlock();
        return 1;
    }
    

    Eigentlich müsste das Programm doch stehenbleiben. Ich setze ein Lock in function() und greife in function2 drauf zu -> eigentlich müsste er doch dann warten, bis das Lock wieder aufgelöst wird (was hier natürlich nie passieren würde!)

    Kann mir jmd. meinen Denkfehler erklären?
    THX schon mal



  • Warum ist die CCriticalSection extern bei dir?
    Bei mir bringt das einen Deadlock:

    CCriticalSection csSection;

    int function2()
    {
        CSingleLock lock( &csSection, false);
        lock.Lock();
          //mache irgendwas
        lock.Unlock();
        return 1;
    }
    
    DWORD function()
    {
        CSingleLock lock( &csSection, false);
        while( true)
        {
               lock.Lock();
               function2();
               lock.Unlock();
            }
    }
    


  • Ne CRITICAL_SECTION unter Windows ist reentrant, deswegen geht das.
    Soll heissen: das geht "by design".



  • Erstmal danke für die Antworten!

    Hab das jetzt mal ohne extern gemacht, geht aber auch nicht. 😕

    Was meinst du mit "by design"? 😕



  • Ahh, alles klar, hab's gerafft 🤡

    Bei ein und demselben Thread wirkt der Lock nicht!

    👍


  • Mod

    Ganz einfach weil aus dem selben Thread aufgerufen Criticalsection nicht blockiert! Intern wird ein Zähler mitgeführt. Das heißt für jeden Aufruf von Criticalsection musst Du auch LeaveCriticalSection aufrufen.
    Solange der Aufruf aus dem selben Thread passiert blockiert nie etwas.
    Ctricalsection soll verhindern, dass ein anderer Thread zeitgleich auf Deine Daten zugreift!


Anmelden zum Antworten