2009-04-28 13 views
3

Ich habe es kürzlich geschafft, einen Thread mit der Boost :: Bind-Funktion zu erstellen.Wann Boost-Thread-Join-Funktion verwenden?

Zur Zeit habe ich die Thread-Anzeige zu stdout. Ich kann die Ausgabe sehen, wenn ich thread.join benutze. Wenn ich dies jedoch nicht mache, sehe ich keine Ausgabe.

Warum ist das?

Ich hoffe, ich muss nicht die Join-Funktion verwenden, weil ich diese Funktion mehrmals aufrufen möchte, ohne auf den zuvor gestarteten Thread warten zu müssen.

Vielen Dank für Ihre Antworten. Was ich wirklich sicherstellen wollte war, dass der Thread tatsächlich ausgeführt wurde. Also habe ich einen Systemaufruf hinzugefügt, um eine nicht existierende Datei zu berühren, und sie war danach da, also wurde der Thread ausgeführt.

+0

Es kann hilfreich sein, einen Beispielcode anzuzeigen. Ich nehme an, dass Ihr 'main()' möglicherweise beendet wird, bevor Ihr Thread drucken kann. Der 'Join'-Aufruf bewirkt, dass" main "auf den Abschluss des Threads wartet. – dubnde

Antwort

3

Ich kann die Ausgabe sehen, wenn ich thread.join verwende. Wenn ich dies jedoch nicht mache, sehe ich keine Ausgabe. Warum ist das?

Wahrscheinlich ist dies ein Nebeneffekt der Art und Weise, wie die Standardausgabe auf Ihrem System gepuffert wird. Haben Sie '\n' und/oder endl in jeder gedruckten Anweisung verstreut? Das sollte die Ausgabe erzwingen (endl spült den Stream zusätzlich).

Wenn Sie die Dokumentation für join betrachten, sehen Sie, dass diese Funktion aufgerufen wird, bis zum Ende des Threads zu warten. Wenn ein Thread beendet wird (oder für einen Prozess), wird die gesamte gepufferte Ausgabe gelöscht.

Sie müssen nicht warten, bis der Thread die Ausführung abgeschlossen hat, um die Ausgabe zu sehen. Es gibt mindestens ein paar Möglichkeiten (ich aus der Spitze von meinem Kopf erinnern kann) Sie dies erreichen können:

  • Make cout/stdout ungepufferte oder
  • Verwendung \n und fflush(stdout) (für C-Stil I/O) oder std::endl Stream Manipulator
+0

Vielleicht sollten Sie umschreiben "wird aufgerufen, um einen Thread zu beenden". Join beendet den Thread nicht, sondern lässt den aktuellen Thread auf den Thread warten, in dem die Join-Methode aufgerufen wurde. Was Ihnen sicher bekannt ist. – Skurmedel

+0

"warte auf den, den die Join-Methode zum Beenden aufgerufen hat." (SO benötigt eine Schaltfläche zum Bearbeiten von Kommentaren.) – Skurmedel

+1

Ja, und ja wieder. – dirkgently

3

standardmäßig sein das Thread-Objekt Destruktor zu dem Haupt-Thread nicht beitreten, könnte es, dass Ihr Haupt-Thread beendet und schließt STDOUT, bevor der Thread seinen Ausgang zu spülen verwaltet?

Beachten Sie, dass der Standard-destructor für Gewinde in C++ 0x tut verbindet (statt wie im Boost zu lösen), so wird dies nicht geschehen (siehe A plea to reconsider detach-on-destruction for thread objects).

Hinweis: Da dies geschrieben wurde, wurde der C++ 11-Standard geändert und ein nicht verbundener Thread beendet nun den Prozess.

+1

In C++ 0x "verbindet" sich der Destruktor eines Threads nicht.Wenn der Thread bei der Destruktion noch verbunden werden kann, beendet die Laufzeitumgebung stattdessen Ihre Anwendung. – typ1232