Bonne façon de mettre en pause, & reprendre un std::thread

Je suis en utilisant un std::thread dans mon C++ code de constamment sondage pour certaines données & ajouter à un tampon. J'utilise un C++ lambda pour démarrer le thread comme celui-ci:

StartMyThread() {

    thread_running = true;
    the_thread = std::thread { [this] {
        while(thread_running) {
          GetData();
        }
    }};
}

thread_running est un atomic<bool> déclaré dans l'en-tête de classe. Voici mon GetData fonction:

GetData() {
    //Some heavy logic which needs to be executed in a worker thread
}

Prochaine j'ai aussi un StopMyThread fonction où j'ai mis thread_running de faux, de sorte qu'il sort de la boucle while dans la lambda block.

StopMyThread() {
  thread_running = false;
  the_thread.join();
}

Il fonctionne bien. La discussion commence & arrête sans s'écraser.

Ce code C++ est utilisé sur iOS, Android, OS X et Windows. Mon INTERFACE utilisateur de l'application dispose d'un bouton qui m'oblige à commencer & arrêter le fil sur simple pression d'un bouton, ce bouton peut être fréquemment utilisé dans certaines occasions. Je peux voir une fraction de seconde de retard dans l'INTERFACE utilisateur, tandis que d'arrêter ou de démarrer le thread.

Ma question est: En C++, est-ce une bonne façon de démarrer/arrêter un thread fréquemment ? Je pense qu'avec cette logique, je suis entrain de créer un nouveau thread à chaque fois. Et comme je vous comprends, la création d'un nouveau thread utilise l'OS allouer beaucoup de nouvelles ressources, ce qui peut être consoming. Et je pense que c'est l'erreur que j'ai fais. Comment puis-je éviter cela ?

Comment pouvez utiliser le même fil, sans allouer de nouveaux de un à plusieurs reprises tout au long du cycle de vie des applications, et tout simplement jouer/pause quand il le faut ?

Le délai peut également être attends-tu pour l'ancien fil de sortie. (Si vous avez deux threads à l'aide de la même thread_running valeur, vous aurez douleur!)
Vous pouvez mettre en pause un fil en le faisant attendre sur un std::mutex.
Attention: Reportez-vous à blogs.msdn.microsoft.com/oldnewthing/20031209-00/?p=41573 pourquoi un général suspend_thread fonction ne va pas être une bonne idée. (L'exemple est sur C# sur Windows, mais les principes s'appliquent partout.) Si vous utilisez un mutex pour le faire attendre, vous aurez à réfléchir sur le blocage de l'UI thread.
Pas exactement sur le point, mais connexes: jetez un oeil à boost::coroutine, il est assez cool.
std::mutex + std::condition_variable. Le resume fonction juste ne ` notify_one

OriginalL'auteur Game_Of_Threads | 2016-11-11