2010-10-19 9 views
16

Ich schaffe boost::thread Objekt mit einem new Operator und weiterhin ohne diesen Thread wartet seine Arbeit zu beenden:Was ist der beste Weg, boost :: thread object zu löschen, nachdem die Arbeit abgeschlossen ist?

void do_work() 
{ 
    // perform some i/o work 
} 

boost::thread *thread = new boost::thread(&do_work); 

Ich denke, es notwendig ist, thread zu löschen, wenn die Arbeit getan ist. Was ist der beste Weg dazu, ohne explizit auf Thread-Terminierung zu warten?

+1

Warum dynamisch den Thread erstellen? –

+0

@Martin York: Weil ich will nicht Thread-Objekt zerstört werden, nachdem der Gültigkeitsbereich der Variablen verlassen. – itsvetkov

+2

Aber wenn Sie es einfach außerhalb des Gültigkeitsbereichs fallen lassen, können Sie nicht darauf zugreifen (und somit leckt es). Da man keine Zugriffe auf Mittel hat, kann man nichts damit anfangen und der eigentliche Thread der Ausführung ist sowieso noch am Leben, also scheint es sinnlos. Hinweis: Sie sollten praktisch ** NIEMALS einen solchen RAW-Zeiger haben. –

Antwort

19

Die Lebensdauer des Objekts und die Lebensdauer des nativen Threads sind nicht voneinander abhängig. Das Objekt kann jederzeit den Gültigkeitsbereich verlassen.

Von der boost::thread Klasse documentation

So wie die Lebensdauer einer Datei von der Lebensdauer eines Iostream Objekt verschieden sein kann, die die Datei kann von dem Thread anders, die Lebensdauer eines Ausführungs-Thread repräsentiert sein Objekt, das den Thread der Ausführung darstellt. Insbesondere wird nach einem Aufruf von join() der Ausführungs-Thread nicht mehr existieren, obwohl das Thread-Objekt bis zum Ende seiner normalen Lebensdauer weiter existiert. Das Umgekehrte ist auch möglich; Wenn ein Thread-Objekt zerstört wird, ohne daß join() zuerst aufgerufen wurde, wird der Ausführungs-Thread fortgesetzt, bis seine Anfangsfunktion abgeschlossen ist.

bearbeiten: Wenn Sie nur einen Thread starten müssen und nie join aufrufen, können Sie den Thread-Konstruktor als Funktion verwenden:

// Launch thread. 
boost::thread(&do_work); 

Allerdings tun schlage ich nicht, dass Sie das tun, , selbst wenn Sie glauben, dass der Thread abgeschlossen ist, bevor main() funktioniert.

+1

Danke. Ich bin neu bei Boost Threads, also lag das Problem in meinem Missverständnis, wie es funktioniert. – itsvetkov

+0

Soweit ich weiß, ist das, wie native Threads sowieso auf den meisten Plattformen funktionieren. Wenn also der Thread-Destruktor nicht als join() bezeichnet wird, was bei Vorhandensein von Ausnahmen ein Chaos wäre, ist dies nur eine normale Konsequenz. –

13

können Sie verwenden

boost::thread t(&do_work); 
t.detach(); 

Sobald der Faden abgenommen ist es nicht länger von dem Objekt boost::thread im Besitz; Das Objekt kann zerstört werden und der Thread wird weiter ausgeführt. Der boost::thread Destruktor ruft auch detach() auf, wenn das Objekt einen laufenden Thread besitzt, sodass t zerstört wird, wird das gleiche Ergebnis haben.

3

Ich schlage vor, Sie verwenden boost :: shared_ptr, so dass Sie darauf, nicht nehmen, wenn Thread-Objekt zu löschen.

boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work)); 
+1

Wie wird dieses Thread-Objekt gelöscht, wenn 'do_work' beendet wird? –

Verwandte Themen