Richtige Weg, um pause & fortsetzen einer std::thread
Bin ich mit einer std::thread
in meinem C++
code ständig poll für einige Daten & fügen Sie es in einen Puffer. Ich benutze eine C++ lambda
zu starten, den thread wie folgt:
StartMyThread() {
thread_running = true;
the_thread = std::thread { [this] {
while(thread_running) {
GetData();
}
}};
}
thread_running
ist ein atomic<bool>
deklariert in der header-Klasse. Hier ist mein GetData
Funktion:
GetData() {
//Some heavy logic which needs to be executed in a worker thread
}
Weiter, ich habe auch ein StopMyThread
Funktion, wo ich einstellen thread_running
auf false, so dass es geht aus der while-Schleife in den lambda block
.
StopMyThread() {
thread_running = false;
the_thread.join();
}
Funktioniert es auch. Der thread beginnt & Haltestellen ohne Absturz.
Dieser C++ - code auf iOS -, Android -, Mac OS X und Windows. Meine Anwendung UI hat eine Taste, die muss ich starten & stoppen Sie den thread auf drücken einer Taste; mit dieser Taste können Sie Häufig verwendet, in einigen Fällen. Ich sehe einen Bruchteil einer Sekunde Verzögerung in der UI beim stoppen oder starten des thread.
Meine Frage ist: In C++, ist dies eine richtige Weg, um zu starten/stoppen eines Threads Häufig ? Ich denke, dass mit dieser Logik, die ich am erstellen eines neuen thread-jeder-Zeit. Und so wie ich das verstehe, erstellen eines neuen Threads macht das OS reservieren, viele neue Ressourcen, aus denen Zeit-consoming. Und ich denke, das ist der Fehler, den ich mache. Wie kann ich diese vermeiden ?
Wie können Gebrauch machen von der gleichen thread ohne Zuweisung von neuen ein wiederholt während des gesamten Lebenszyklus Ihrer Anwendung, und nur play/pause, wenn erforderlich ?
thread_running
Wert, Sie haben Kummer!)Sie können eine pause ein thread, indem es warten auf eine
std::mutex
.Achtung: Siehe auch blogs.msdn.microsoft.com/oldnewthing/20031209-00/?p=41573, warum eine Allgemeine
suspend_thread
Funktion ist nicht eine gute Idee zu sein. (Das Beispiel ist über C# auf Windows, aber die Prinzipien gelten überall.) Wenn Sie einen mutex verwenden, um es zu warten, Sie müssen denken Sie sorgfältig über die Blockierung der UI-thread.Nicht genau auf dem Punkt, aber im Zusammenhang: werfen Sie einen Blick auf boost::koroutine, es ist eine ziemlich Coole Sache.
std::mutex
+ std::condition_variable
. Die resume
Funktion nur noch ` notify_one
InformationsquelleAutor Game_Of_Threads | 2016-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist das klassische Beispiel für die Verwendung von einem Zustand-variable. Sie warten auf einem mutex und Benachrichtigen Sie einen thread, wenn eine bestimmte Bedingung erfüllt ist; auf diese Weise brauchen Sie nicht zu reservieren einen neuen thread, wenn du eine brauchst, aber das ist nicht immer eine gute Sache, wenn Sie möchten, um Speicherplatz zu sparen. Eine alternative wäre eine koroutine, die nachgeben, an eine andere koroutine, wenn Daten benötigt werden, was wohl schöner. Sie implementieren müssen, um Coroutinen selbst, oder eine fertige Bibliothek, wie
boost.coroutine
.Beispiel
Informieren:
Da ist es oft schneller, um kostenlos das Schloss vor, bevor er, als Umgekehrt.
Eine nit-pick. Warum, um vollständig zu qualifizieren
std
namespace ? Es ist hässlich und nutzlos, es sei denn, du hast etwas, was böse und falsch ist.warum verwenden Sie einen
.detach
am Ende. Würde dies nicht machen es zu einemdaemon
thread ?Ja, es ist in einem getrennten thread, aber er weiß von join(), so kann er es anders machen.
Dank T. C. fixe Antwort
InformationsquelleAutor user1095108