pthread soll aus einer Methode eine andere Methode starten



  • Hi,

    vielleicht könnt ihr mir helfen. Ich versuche im Moment mit Hilfe von pthread.h eine neue Klasse zu erstellen, in der dann aus einer Methode1 der Klasse eine andere Methode2 aufgerufen wird. Konkretes Beispiel wäre eine Methode die entweder einfach ausgeführt wird oder vorher in einer anderen Methode als Thread aufgerufen wird.

    class Ablauf
    {
     public:
     pthread_t thr;
     void starteimHintergrund();
     void starte();
     void funktion();
     private:
    
    };
    void funktion()
    {
      // tue was
    }
    
    void starteimHintergrund()
    {
     pthread_create(&thr,NULL,???,NULL);
    }
    void starte()
    {
     funktion();
    }
    
    int main()
    {
     Ablauf a1;
     a1.starteimHintergrund();
     a1.starte();
     return 0;
    }
    

    Hoffe, dass das verständlich ist. 🙄



  • Wer ist eigentlich pthread? Warum verwenden den immer mehr Anfänger?



  • 1. Du musst den Klassen Scope bei der Def. deiner Klassen Methoden angeben:

    Bsp:

    void Ablauf::funktion() 
    { 
      // tue was 
    }
    

    Löst nicht derin Problem mit dem Thread... ich weiss...

    Edit:
    2. Ich habe dein Bsp ein wenig geändert...

    #include "pthread.h"
    
    class Ablauf
    {
    public:
        Ablauf();
        void starteimHintergrund();
        void warteAufEnde();
        void starte();
        void funktion();
    
    private:
        static void* thhreadFunktion(void* args);
    
    private:
        pthread_t thread;
    };
    
    Ablauf::Ablauf()
    : thread()
    {
    }
    
    void Ablauf::funktion()
    {
        // tue was
    }
    
    void Ablauf::starteimHintergrund()
    {
        pthread_create(&thread, NULL, &Ablauf::thhreadFunktion, this);
    }
    void Ablauf::warteAufEnde()
    {
        pthread_join(thread, 0);
    }
    void Ablauf::starte()
    {
        funktion();
    }
    void* Ablauf::thhreadFunktion(void* args)
    {
        Ablauf* instanz = reinterpret_cast<Ablauf*>(args);
        instanz->starte();
        return 0;
    }
    
    int main()
    {
        Ablauf a1;
        a1.starteimHintergrund();
        a1.warteAufEnde();
    }
    


  • theta schrieb:

    1. Du musst den Klassen Scope bei der Def. deiner Klassen Methoden angeben:

    Ja, stimmt ... war ein Tippfehler ... die sollte schon eine Methode der Klasse sein. Danke

    theta schrieb:

    2. Ich habe dein Bsp ein wenig geändert...

    Ich habe es gerade ausprobiert und der Thread wird gestartet. Ich weiß aus den POSIX-Dokumenten, dass das join wartet (und das Programm anhält) bis der Thread fertig ist ... leider kann er aber auch vor dem Join keine weiteren Funktionen starten:

    #include "pthread.h"
    #include <iostream>
    
    using namespace std;
    
    class Ablauf
    {
    public:
        Ablauf();
        void starteimHintergrund();
        void warteAufEnde();
        void starte();
        void funktion();
        void funktion2();
    private:
        static void* thhreadFunktion(void* args);
    
    private:
        pthread_t thread;
    };
    
    Ablauf::Ablauf()
    : thread()
    {
    }
    
    void Ablauf::funktion()
    {
        cout<<"Ich bin ein Thread";// tue was
    	while(1);
    }
    void Ablauf::funktion2()
    {
        cout<<"Ich bin KEIN Thread";
    }
    void Ablauf::starteimHintergrund()
    {
        pthread_create(&thread, NULL, &Ablauf::thhreadFunktion, this);
    }
    void Ablauf::warteAufEnde()
    {
        pthread_join(thread, 0);
    }
    void Ablauf::starte()
    {
        funktion();
    }
    void* Ablauf::thhreadFunktion(void* args)
    {
        Ablauf* instanz = reinterpret_cast<Ablauf*>(args);
        instanz->starte();
        return 0;
    }
    
    int main()
    {
        Ablauf a1;
        Ablauf a2;
        a1.starteimHintergrund();
        a2.funktion2();
        a1.warteAufEnde();
    
    }
    

    Vielleicht bin ich ja aber insgesamt auf dem Holzweg. Eigentlich sollen nur mehrere Abläufe (irgendwas wird gesetzt, ausgelesen, etc) hintereinander aber auch parallel ablaufen (halt je nachdem wie der Programmierer es will). Also im Beispiel oben würde funktion 1 z.b. in der Endlosschleife hängen bis irgendwas passiert ... und das dann funktion2 melden die aber nur einmal durchläuft. Ich hoffe ich habe mich verständlich ausgedrückt.

    Aber danke bisher Θ 😉



  • Nein du hast dich nicht verstaendlich ausgedrueckt. Wie war doch gleich deine Frage? Wo gibt es Probleme? Ansonsten solltest du vielleicht boost::thread verwenden oder dich mal mehr mit Multithreading auseinandersetzen als nur die POSIX-Dokumente zu lesen. Diese sind nur die Gebrauchsanweisung (naja gut, schon wesentlich mehr).



  • Du solltest in deinem Thread den Scope abgeben, damit ein anderer Thread drankommt.

    Sprich

    void Ablauf::funktion()
    {
        cout<<"Ich bin ein Thread";// tue was
        while(1){ 
          sleep(1);  // <-- hier
        };
    }
    

Anmelden zum Antworten