Thread soll durchlaufen, ohne von einem anderen unterbrochen zu werden



  • Hallo,

    ich bin total neu in der Thread-Programmierung unter c++. Eigentlich will ich nur, dass eine Reihenfolge von Befehlen in einem Thread abgearbeitet wird, ohne dass diese von einem anderen Thread unterbrochen wird.
    Ich hab gedacht, dieses Problem könnte ich mit der CCriticalSection lösen. Also, mein Code sieht so aus:

    void ThreadKlasse:function()
    {
       CCriticalSection cs;
       cs.Lock();
       this->function1();
       this->function2();
       CString sz = "Hallo";
       cs.Unlock();
    

    Aber irgendwie haut das so nicht hin. Einer der 3 anderen Threads schaltet sich einfach - wenn er Lust hat - dazwischen.
    Kann mir einer sagen, wo da mein Gedankenfehler liegt? Oder bin ich total auf dem Holzweg?

    Ich bedanke mich schonmal 😃
    LG



  • Die CCriticalSection gibt soweit ich weiss nur an, dass dieser Codebereich nicht gleichzeitig von verschiedenen Stellen ausgeführt werden kann.
    Um auszuschliessen das ein Thread nicht verdrängt werden kann, musst du in die
    Kernel Programmierung einsteigen. Den auf Benutzer Ebene fehlen dir die nötige Prioritäten für entsprechenden Funktionalität.
    Der Scheduler von deinem MS Betriebssystem wird dir immer dazwischen funken.
    Leider kann ich dir mit Kernel Programmierung nicht weiter helfen.

    Ich hoffe das war deine Frage.

    Ciao charlie



  • Ich glaube die CCriticalSection sollte nicht lokal sein,da sonst jeder Thread eine eigene hat.



  • wenn du verhindern willst, dass dem thread arbeitszeit abgenommen wird

    SEHR SCHWIERIG...

    ich vermute mal, du musst nur die variablen vor gleichzeitigem
    zugriff schützen. dann geht das wie gesagt mit ner critsec, die
    dann abba, wie ebenfalls schon gesagt, global sein muss, odda
    evtl. member der klasse

    void ThreadKlasse:function()
    {
     CSingleLock Lock ( &m_Lock, TRUE);
    
     //HIER DIE GESCHÜTZTEN VARIABLEN BEARBEITEN
    }
    

    durch das hilfsobjekt Lock vom typ CSingleLock
    wird erstmal die Lock-funktion von m_Lock
    aufgerufen...

    dann gibt es aber noch die möglichkeiten, das verhalten zu regeln,
    falls m_Lock bereits gesperrt ist....

    das findest du abba bestimmt auch so raus....

    msdn und doc helfen



  • Wenn du eine Thread nach dem anderen ausführen willst dann starte doch die anderen wenn der vorgänger fertig ist.
    Alles andere geht nicht so einfach und würde auch keine Sinn machen



  • Hi,

    schonmal THX für die Antworten. Ich hab halt gedacht, die CriticalSection ist sowas wie der synchronized Block in Java. Das scheint ja irgendwie nicht so 😢

    Aber jetzt bin ich total verwirrt:

    LUZA schrieb:

    durch das hilfsobjekt Lock vom typ CSingleLock
    wird erstmal die Lock-funktion von m_Lock
    aufgerufen...

    Warum brauch ich jetzt nen CSingleLock???
    Reicht es nicht aus, die CriticalSection global zu machen und so jeder Threadklasse zur Verfügung zu stellen?
    Woher weiß der Compiler aber eigentlich dann, welches Objekt gerade gesperrt ist? 😕


Anmelden zum Antworten