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 ?

Die Verzögerung kann auch sein, Sie warten auf den alten thread zu beenden. (Wenn Sie zwei threads mit der gleichen 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

Schreibe einen Kommentar