2009-12-29 15 views
12

Je travaille actuellement sur une petite classe wrapper pour le fil de boost, mais je ne comprends vraiment comment fonctionne la fonction de sommeil, ce que j'ai jusqu'à présent:Que fait boost :: thread sleep()?

BaseThread::BaseThread(){ 
    thread = boost::thread(); 
    bIsActive = true; 
} 

BaseThread::~BaseThread(){ 
    join(); 
} 

void BaseThread::join(){ 
    thread.join(); 
} 

void BaseThread::sleep(uint32 _msecs){ 
    if(bIsActive) 
     boost::this_thread::sleep(boost::posix_time::milliseconds(_msecs)); 
} 

Voilà comment je mis en œuvre jusqu'à présent, mais Je ne comprends pas vraiment comment la méthode static this_thread :: sleep sait quel thread doit dormir si par exemple plusieurs instances de mon wrapper sont actives. Est-ce la bonne façon de le mettre en œuvre?

Répondre

17

boost::this_thread::sleep va dormir le fil actuel. Seul le fil lui-même peut s'endormir. Si vous souhaitez mettre un thread en veille, ajoutez un code de contrôle dans le fil ou use interruptions. MISE À JOUR: si vous utilisez un compilateur C++ 11 avec la bibliothèque standard à jour, vous aurez accès aux fonctions std::this_thread::sleep_for et std::this_thread::sleep_until. Cependant, il n'y a pas de mécanisme d'interruption standard.

+0

vérifier le code comme quoi? les interruptions semblent être un bon moyen aussi. – user240137

+0

Ce que je veux dire par "vérifier le code" est que dans le code exécuté par le thread donné, il y a quelque part un "if" qui vérifie s'il doit être dormi et le fait si nécessaire. Par exemple si votre thread exécute une fonction avec une grosse boucle, alors vérifier si elle a besoin de dormir (en vérifiant un ensemble booléen par votre code actuel par exemple) à chaque fin de l'itération de la boucle peut être suffisant. Mais dans votre cas, vous ne voulez pas être intrusif à votre code de fil, donc les interruptions semblent être une meilleure alternative. – Klaim

2

sleep affecte toujours le thread en cours (celui qui appelle la méthode).