Frage zu Boost::thread



  • Hallo,

    ich bin gerade dabei, mir die thread.cpp der Boost-Bibliothek (Version 1.30.2) anzusehen und habe eine Frage zu folgender Funktion:

    thread* thread_group::create_thread(const function0<void>& threadfunc)
    {
        // No scoped_lock required here since the only "shared data" that's
        // modified here occurs inside add_thread which does scoped_lock.
        std::auto_ptr<thread> thrd(new thread(threadfunc));
        add_thread(thrd.get());
        return thrd.release();
    }
    

    add_thread() fügt dabei das erzeugte thread-Objekt in eine Membervariable vom Typ std::list ein.
    Warum wird hier auto_ptr verwendet? Er löst sich doch vor return wieder vom Speicher, der also nicht bei Verlassen der Funktion wieder freigegeben wird (dies geschieht via remove_thread() oder in ~thread_group()).

    Danke im Voraus. 🙂



  • Ich rate mal, vielleicht aus Angst vor exceptions?



  • Hmm, daran habe ich zugegebenermaßen gar nicht gedacht... würde dann allerdings ein try-catch-Block nicht Sinn machen?



  • schreib diesen code mal so um, so dass er dasselbe macht, nur ohne auto_ptr



  • thread* thread_group::create_thread(const function0<void>& threadfunc) 
    { 
        // No scoped_lock required here since the only "shared data" that's 
        // modified here occurs inside add_thread which does scoped_lock. 
        thread pThread = new thread(threadfunc);
        try
        {
            add_thread(pThread);
        } catch(...)
        {
            delete pThread;
        }
        return pThread; 
    }
    

    So ungefähr? Wäre das falsch?



  • nicht ganz 😉
    denk mal nach, was im original passiert, wenn in der funktion add_thread eine ausnahme geworfen wird, bzw. was mit dem teil des programms passiert, wenn create_thread aufgerufen wird, im vergleich zu dem, was bei deinem code passiert;
    und was in deinem code passiert, nachdem der zeiger gelöscht wird.



  • thread* thread_group::create_thread(const function0<void>& threadfunc)  
    {  
        // No scoped_lock required here since the only "shared data" that's  
        // modified here occurs inside add_thread which does scoped_lock.  
        thread pThread = new thread(threadfunc); 
        try 
        { 
            add_thread(pThread); 
        } catch(...) 
        { 
            delete pThread; 
            throw;
        } 
        return pThread;  
    }
    

    Ist das korrekt?



  • Jester schrieb:

    Ist das korrekt?

    Davon abgesehen, dass pThread ein Zeiger sein sollte 😉 sieht es korrekt aus.

    Und hier sieht man schon den klaren Vorteil der smart pointer Variante.

    3 Zeilen versus 7 Zeilen


Anmelden zum Antworten