boost::thread



  • hi
    wie kann ich abfragen, ob ein thread seine funktion erledigt hat?
    (und ja ich habe hier geschaut aber es nicht gefunden....:
    http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.thread
    )

    schonmal danke für hilfe



  • Du könntest diese Funktion hier benutzen:
    http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.this_thread.atthreadexit

    Und da kriegst du dann halt asynchron mit über ob der Thread fertig ist oder nicht. Wofür brauchst du das überhaupt? Threads irgendwie wieder eine sequentielle Vorschrift zu zwängen halte ich für wenig sinnvoll. Allenfalls reicht ja auch ein yield?



  • EDIT: zu spät...



  • Oder timed_join mit Null-Timeout.



  • hustbaer schrieb:

    Oder timed_join mit Null-Timeout.

    der nachteil ist, dass der thread, falls er gerade wegen join, sleep oder wait wartet, abgebrochen wird.

    @drakon
    mit den beiden funktionen arbeite ich aus dem thread heraus.

    ich möchte eine klasse schreiben, die threads verwaltet.
    da es ja vorkommen kannn, dass viele threads mit der zeit erstellt werden, muss ich auch viele handels speichern.
    wenn ich jetzt 100 abgelaufene threads habe, dann speicher ich 100 nutzlose threadhandels.
    nun will ich eine funktion schreiben, die abgelaufene threads aus der internen liste löscht.
    dafür muss ich aber überprüfen können, ob ein thread wirklich fertig ist.
    auf das vorgeschlagenetimed_join mit null wartezeit kam ich auch, aber das kann ich aus den angegebenen gründen nicht nutzen.



  • Da würden mir verschiedene Wege einfallen, ohne erst in Boost etwas raus zu suchen. Du kannst an alle Threads ein Signal senden, wenn der Thread fertig ist. Dieses Signal fängt dann dein Verwaltungsthread und wertet den Sender aus. Eine andere Möglichkeit wäre es, selber im Thread Zustände (warten/laufend/fertig) zu speichern, die vom Verwaltungsthread abgefragt werden können. Das ist nicht weiter schlimm, weil der Verwaltungsthread nur auf den letzten Zustand reagieren muss. Aber vielleicht gibt es ja schon die Möglichkeit den Zustand abzufragen.



  • Ich vermute du möchtest in etwa sowas: (ungetestet)

    #include<vector>
    #include<boost/thread.hpp>
    #include<boost/function.hpp>
    
    template<typename TParam>
    class MyThread
    {
    public:
            MyThread(const TParam& par): state(new State(Created)), par(par){
            }
    
            void start(){
                    boost::thread thrd(boost::bind(&MyThread::startThread,this));
            }
            enum State {Created, Running, Terminated};
    
    private:
            void startThread(){
                    *state = Running;
                    // ...
                    *state = Terminated;
            }
    
            boost::shared_ptr<State> state;
            TParam par;
    };
    
    int main(int argc, char* argv[])
    {
            std::vector<MyThread<int> > vector;
            for(int i=0; i<5; ++i){
                    vector.push_back(i);
                    MyThread<int>& thread = *vector.rbegin();
                    thread.start();
            }
            return 0;
    }
    

    Gruß,
    XSpille



  • ups......
    mir ist gerade aufgefallen, dass ich mich verlesen habe.
    ein timed_join ohne delay ist ein unterbrechungspunkt, aber es unterbricht nicht an einem unterbrechungspunkt, was ich aus irgendeinem grund gedacht habe.....

    also hat sich das ganze erledigt. timed join kann eingesetzt werden.

    aber danke an alle


Anmelden zum Antworten