CRITICAL_SECTION doppelter eintritt



  • Hi,

    ich habe hier ein folgendes beispiel Object:

    class blub
    {
    private:
    
    CRITICAL_SECTION csAccess;
    
    DWORD a;
    DWORD b;
    
    void __serialize(void);        //EnterCriticalSection
    void __unserialize(void);      //LeaveCriticalSection
    
    DWORD _innere_methodeA(DWORD _a);
    DWORD _innere_methodeB(DWORD _b);
    public:
      blub();
     ~blub();
    
      void MethodeA(DWORD param);
      void MethodeB(DWORD param);
    }
    
    DWORD blub::_innere_methodeA(DWORD _a)
    {
       DWORD dwTemp=0;
      __serialize();
          dwTemp=this->a;
          this->a=_a;
      __unserialize();
     return dwTemp;
    };
    
    DWORD blub::_innere_methodeB(DWORD _b)
    {
      DWORD dwTemp=this->b;
      this->b=_b;
     return dwTemp;
    };
    
    DWORD blub::MethodeA(DWORD _a)
    {
    
      __serialize();
    
      if(_a==EIN_PRE_DEFINIERTER_WERT)
       {
         DWORD dwTemp=this->innere_methodeA(_a);  
         this->b=dwTemp;    
       }
      .
      .
      .
     __unserialize();
    };
    

    Jetzt wird hier exemplarisch zwei mal __serialize() aufgerufen, was ja kein problem darstellt, wennd er thread schon eigener der Sektion ist.
    Da die private Methode mit __unserialize (LeaveCriticalSection() ) den Lock
    wieder aufhebt ist die zuweisung " this->b=dwTemp" nicht gesichert oder?

    MSDN sagt dazu:
    "When a thread owns a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution. This prevents a thread from deadlocking itself while waiting for a critical section that it already owns. To release its ownership, the thread must call LeaveCriticalSection one time for each time that it entered the critical section."

    Denn heißt das jetzt einmalig für jeden eintritt, oder jedesmal einmalig für den jeweiligen eintritt ?

    Grüße und habt dank,...



  • Hallo zeusosc,

    Windows hat einen rekursiven mutex implementiert.
    Sprich Windows zählt intern alle "enters" und alle "leaves" vom selben Thread.

    Erst nachdem das letze "leave" erfolgt ist ist die Sektion wieder frei.

    Kurz alles in Ordnung.

    Gruß Frank



  • Ahh super,.

    Danke 🙂


Log in to reply