Comment puis-je déterminer de manière fiable si un coup de pouce fil a quitté sa méthode run?
Je suppose recrutables indiquerait cela, cependant, il ne semble pas être le cas.
Dans une classe d'opérateur, j'ai tenté d'indiquer qu'il était toujours en cours de traitement par le biais d'un prédicat:
bool isRunning(){return thread_->joinable();}
Ne serait pas un fil qui est sorti de ne pas être joignable? Ce qui me manque... quel est le sens de boost thread::recrutables?
Vous devez vous connecter pour publier un commentaire.
Puisque vous pouvez vous joindre à un fil, même après qu'il soit terminé, recrutables() renvoie toujours vrai jusqu'à ce que vous appelez join() ou detach(). Si vous voulez savoir si un thread est toujours en cours d'exécution, vous devriez être en mesure d'appeler timed_join avec un temps d'attente de 0. Notez que cela peut entraîner dans une situation de compétition depuis le thread peut mettre fin à droite après l'appel.
timed_join
seul ne peut pas faire ça. si vous faites des hypothèses incorrectes sur la base du résultat de l'appel, vous pouvez vous retrouver avec une course à condition, bien sûr, mais c'est de moins en moins à voir avectimed_join
qu'avec vous, en supposant que le résultat de cet appel est toujours valide. De toute façon, +1Utilisation thread::timed_join() avec un minimum de délai d'attente. Il retournera false si le fil est toujours en cours d'exécution.
Exemple de code:
Je suis d'utilisation de boost 1.54, par lequel l'étape timed_join() est obsolète. En fonction de votre utilisation, vous pouvez utiliser recrutables() qui fonctionne parfaitement pour mes fins, ou, alternativement, vous pouvez utiliser try_join_for() ou try_join_until(), voir:
http://www.boost.org/doc/libs/1_54_0/doc/html/thread/thread_management.html
Vous fondamentalement ne peut pas le faire. La raison en est que les deux réponses possibles sont "Oui" et "Pas la dernière fois que j'ai regardé, mais peut-être que maintenant". Il n'y a aucun moyen fiable de déterminer qu'un thread est toujours à l'intérieur de sa méthode run, même si il y avait un moyen fiable de déterminer le contraire.
C'est un peu brut, mais comme de maintenant, il travaille toujours pour mes besoins. 🙂 Je suis d'utilisation de boost 153 et qt. J'ai créé un vecteur d'int pour le suivi de l "état" de mon fils. Chaque fois que je créer un nouveau fil de discussion, j'ai ajouter une entrée à thread_ids avec une valeur de 0. Pour chaque thread créé, je passe un ID donc je sais ce que la partie de thread_ids je suis censé mettre à jour. Définir l'état à 1 pour la course et les autres valeurs en fonction de ce que je suis en train de faire donc je sais ce que l'activité était en cours au moment de la thread terminé. 100 est la valeur que j'ai mis pour un bien fini thread. Je ne sais pas si cela va vous aider mais si vous avez d'autres suggestions sur la façon d'améliorer ce laissez-moi savoir. 🙂
Le moyen le plus facile, si la fonction qui exécute votre fil est assez simple, est de définir une variable à true lorsque la fonction est terminée. Bien sûr, vous aurez besoin d'une variable par thread, si vous avez beaucoup d'une carte d'id de thread et l'état, peuvent être une meilleure option. Je sais que c'est fabriqué à la main, mais il fonctionne très bien en attendant.
Cela peut ne pas être une réponse directe à votre question, mais je vois le fil concept vraiment mécanisme léger, et volontairement dépourvu de de tout, sauf de la synchronisation des mécanismes. Je pense que le bon endroit pour mettre "est en cours d'exécution" est dans la classe qui définit la fonction de thread. Notez que d'un point de vue de la conception, vous pouvez quitter le fil sur l'interruption et toujours pas votre travail terminé. Si vous voulez nettoyer le fil après qu'il est terminé, vous pouvez l'envelopper dans un coffre-fort pointeur et le remettre à la catégorie des travailleurs.