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