Welchen Include für Critical Section



  • MisterX schrieb:

    Könnte BITTE Jemand dies in mein kleines Testprogramm einbauen?

    in der main, bevor die threads gestartet werden: InitializeCriticalSection
    in der threadproc. vor die schleife: EnterCriticalSection
    ...und hinter der schleife: LeaveCriticalSection



  • OK, ich habe es versucht, doch ich komme mit dem
    "LPCRITICAL_SECTION lpCriticalSection" nicht zurecht.
    (Sogar mal was in der MSDN gefunden 🙂 )

    Kann mir das nicht doch Jemand mal einbauen, sonnst muß ich wieder 1000 Fragen zu diesem neuen Problem stellen, denn an den Beispiel lernt man doch am schnellsten.



  • Das heisst doch nicht anderes, als dass du eine Adresse übergeben sollst. 🙄

    CRITICAL_SECTION CriSect;
    
    main (..)
    {
        ....
        InitializeCriticalSection (&CriSect);
        ....
    }
    

    Usw.

    [Edit]Rechtschreibung[/Edit]



  • MisterX schrieb:

    OK, ich habe es versucht, doch ich komme mit dem
    "LPCRITICAL_SECTION lpCriticalSection" nicht zurecht.
    (Sogar mal was in der MSDN gefunden 🙂 )

    Dann lies doch einfach ein paar Zeilen weiter - "LPCRITICAL_SECTION" ist ein Pointer auf eine CRITICAL_SECTION, d.h. du mußt dort die Adresse (Stichwort &) eines CRITICAL_SECTION-Objekt übergeben, das du vorher definiert hast.



  • JUHU, es klappt jetzt, DANKE.

    Aber ich habe auch

    Parameters
    lpCriticalSection 
    [out] Pointer to the critical section object.
    

    gelesen.

    Aber wie kommt man darauf, dass das Objekt

    CRITICAL_SECTION

    mit Bindestrich heißen soll, wenn in der MSDN

    [out] Pointer to the "critical section" object.
    

    steht? 😕

    Mir ist schon klar, das es keine Leerzeichen enthalten darf, aber ich habe Vieles Probiert: Kleingeschrieben mit Bindestrich, groß mit Unterstrich, nur leider die richtige Version nicht.



  • MisterX schrieb:

    Aber wie kommt man darauf, dass das Objekt

    CRITICAL_SECTION

    mit Bindestrich heißen soll, wenn in der MSDN

    [out] Pointer to the "critical section" object.
    

    steht? 😕

    Indem man einfach ein wenig weiter liest:

    MSDN Library schrieb:

    The process is responsible for allocating the memory used by a critical section object, which it can do by declaring a variable of type CRITICAL_SECTION



  • DANKE!!!!!!!,

    jetzt habe ich erst mal verstanden, wie so ein MSDN Artikel generell aufgebaut ist 😃 😃

    Noch eine Frage zum Thema:
    Kann ich die Critical Section auch in mein Objekt selbst einbauen etwa so:

    class Point 
    { 
    
    private: 
    
    	CRITICAL_SECTION CriSect;
        int m_x; 
        int m_y; 
    
    public: 
    
    	Point () {
    
    	InitializeCriticalSection(&CriSect); 
    	}
    
       void setXY(int x,int y) 
       { 
          EnterCriticalSection(&CriSect);
    			m_x = x; 
    			m_y = y;
          LeaveCriticalSection(&CriSect) ;
    
       } 
    
       void gibaus() {
    	    EnterCriticalSection(&CriSect);
    			printf("%d "  ,(int)m_x  );	
    			printf("%d \n",(int)m_y  );
    		LeaveCriticalSection(&CriSect) ;
       }
    
    };
    

    oder ist das falsch?



  • Fast richtig - jetzt brauchst du nur einen Destruktor, der DeleteCriticalSection() aufruft (und entsprechend der "Rule of Three" einen Copy-Ctor und Zuweisungsoperator, sonst steht dir ein Systemcrash bevor).



  • Sowas würde man aber in der Realität nie programmieren. Man verschiebt die Thread-Synchronisation weiter nach aussen.



  • jetzt habe ich den Konstruktor eingebaut

    class Point 
    { 
    
    private: 
    
        CRITICAL_SECTION CriSect; 
        int m_x; 
        int m_y; 
    
    public: 
    
        Point () { 
          InitializeCriticalSection(&CriSect); 
        } 
    
    	~Point () {
    		DeleteCriticalSection(&CriSect);
    	}
    
       void setXY(int x,int y) 
       { 
          EnterCriticalSection(&CriSect); 
                m_x = x; 
                m_y = y; 
          LeaveCriticalSection(&CriSect) ; 
    
       } 
    
       void gibaus() { 
            EnterCriticalSection(&CriSect); 
                printf("%d "  ,(int)m_x  );    
                printf("%d \n",(int)m_y  ); 
            LeaveCriticalSection(&CriSect) ; 
       } 
    
    };
    

    Aber was ist mit "Rule of Three" gemeint?
    Wenn ich danach suche erhalte ich immer Theroien zu 3 großen marktbeherschenden Firmen 😕

    Und was ist ein einen Copy Construktor?



  • CStoll schrieb:

    sonst steht dir ein Systemcrash bevor

    ach quatsch. windows verträgt eine ganze menge 😉



  • MisterX schrieb:

    Aber was ist mit "Rule of Three" gemeint?
    Wenn ich danach suche erhalte ich immer Theroien zu 3 großen marktbeherschenden Firmen 😕

    Kurzform: Wenn eine Klasse eine der "großen 3" Methoden (Destruktor, Copy-Construktor, operator=) benötigt, benötigt sie typischerweise alle drei.

    oder ausführlicher für deinen Fall:
    Dein Dtor zerlegt die Critical Section - die vom Compiler erzeugten Kopier-Methoden kopieren diese jedoch blind weiter. D.h. wenn ein Point-Objekt kopiert wird, arbeiten beide Objekte mit der selben Critical Section (das führt im besten Fall dazu, daß sie sich gegenseitig aussperren, im schlimmsten Fall versuchst du irgendwann, eine nicht-initialisierte CritSec zu verwenden.

    @net: Wenn Windows das kompensieren kann, hast du viel Glück gehabt - ich würde mich nicht darauf verlassen 😉


Anmelden zum Antworten