Thread bleibt stehen



  • Hallo Experten,
    ich habe in meiner Anwendung mehrere Instanzen von "ProcessObject". Mein "ProcessObject" ist auch ein std::thread. Somit laufen alle Instanzen als eigener Thread.
    Die "POs" kommunzieren über "Signale". Ein "Signal" ist ein Objekt das MemberFunktionen von anderen "POs" aufruft. Dies funktioniert auch tadellos!
    Mein Problem ist, daß ein PO nach dem "Versenden" eines Signals stehen bleibt!
    Dieses Verhalten tritt erst nach einer Weile ein. Zudem handelt es sich um eine PO-Instanz, welche Im Programmablauf bereits zuvor funktionierte. Daher meine Vermutung, dass es sich hierbei um ein generelles Thread-Problem handelt.
    Wichtige Anmerkung: Ich habe keine Mutex, da eine aufgerufene Memberfunktion eines POs immer nur von EINEM PO aufgerufen wird.
    Mit meiner sehr geringen Thread-Erfahrung komme ich nicht weiter. Sicherlich hat einer von Euch eine Idee was ich falsch gemacht habe.
    Hier meine Code-Fragmente:

    // ProcessObject
    class ProcessObject : public std::thread{
    ...
    }
    
    // Ein "Job" ist ein "ProcessObject" (Verbung)
    void Job::setRunning(){
        if(_state.compare("AppStarting")==0){
            ...
            this->sigRunning.send(true); // Signal wird erfolgreich versendet (Kontrolle am EmpfangsObject)
            // HIER LÄUFT DIESER THREAD NICHT MEHR WEITER        
         }
    }
    


  • Wenn ich dich richtig verstanden habe, ruft sigRunning.send() eine Funktion aus einem anderen PO auf, welche möglicherweise in einem anderen Thread lebt. Und du hast keinerlei synchronisation (zumindest in dem kleinen Fragment). Das richt förmlich nach Problemen, auch wenn ich dir nicht sagen kann, wo die entstehen.

    Ich habe auch noch nie von std::thread geerbt und kann grade nicht sagen, ob die vorgehensweise überhaupt vorgesehen ist.



  • Ja - du hast alles richtig verstanden.
    Wie würdest du es machen ?



  • Hm, gute Frage.

    Insgesamt kommt es auf ziemlich auf das gesamt Design an. Das letzte mal, dass ich was Parallelisiert habe, habe ich das mit std::future und std::async gemacht.

    Wenn nicht mit futures, dann würde ich ein Objekt von std::thread da erstellen, wo ich ihn brauche.

    Könnte vlt so aussehen:

    Job::runJob()
    {
      std::thread runThread(&Job::setRunning, this);
      //mach irgendwas
      runThread.join();
    }
    

    So lange wie ich jetzt für diesen Post brauche, sollte ich vlt so langsam ins Wochenende gehen.


Anmelden zum Antworten