56 votes

Interruption du thread C ++0x

Selon le dernier brouillon C ++ 0x, il n'y a aucun moyen de demander à un thread de se terminer. Cela dit, si nécessaire, nous devons mettre en œuvre une solution à faire soi-même.

D'autre part, boost :: thread fournit un mécanisme permettant d'interrompre un thread de manière sécurisée .

Selon toi, quelle est la meilleure solution? Vous concevez votre propre «mécanisme d’interruption» coopératif ou vous devenez natif?

16voto

peterchen Points 21792

Tout le langage de spécification indique que le soutien n'est pas intégré dans la langue. boost::thread::interrupt des besoins de soutien de la fonction de thread, trop:

Lors de l'interruption du fil suivant exécute une ou de l'interruption des points (ou si elle est actuellement bloqué, tout en exécutant un)

c'est à dire lorsque la fonction de thread n'est pas donner à l'appelant une chance de vous interrompre, vous êtes toujours bloqué.

Je ne suis pas sûr de ce que tu veux dire avec "going native" - il n'y a pas de support natif, sauf si vous êtes fasciné à l' boost:threads.

Encore, j'utilise un mécanisme explicite. Vous avez à penser à avoir assez d'interruption de points de toute façon, pourquoi ne pas les rendre explicites? Le code supplémentaire est généralement marginale dans mon expérience, bien que vous devrez peut-être modifier certains attend à partir de l'objet unique à de multiples objets, qui - selon votre bibliothèque peut paraître plus laide.


On pourrait également tirer sur le "ne pas utiliser les exceptions pour le contrôle de flux", mais par rapport à déconner avec les threads, c'est juste une ligne directrice.

10voto

En utilisant natif de la poignée pour annuler un thread est une mauvaise option en C++ que vous devez détruire toutes les empiler les objets alloués. C'était la principale raison pour laquelle ils ne sont pas inclus une opération d'annulation.

Coup de pouce.Fil fournit une interruption mécanisme, qui doit unir sur toute attente primitive. Comme cela peut être coûteux comme un mécanisme général, le standard n'a pas compris.

Vous devrez mettre en place par vous-même. Voir ma réponse ici à une question similaire sur la façon de mettre cela par vous-même. Pour compléter la solution d'une interruption doit être jeter en cas d'interruption est vrai et le fil doit attraper cette interruption et la finition.

6voto

user328543 Points 418

Il est dangereux de mettre fin à un thread, car vous n’auriez aucun contrôle sur l’état des structures de données sur lesquelles vous travailliez à ce moment.

Si vous souhaitez interrompre un thread en cours d'exécution, vous devez implémenter votre propre mécanisme. IMHO si vous avez besoin de cela, votre conception n'est pas préparée pour plusieurs threads.

Si vous voulez juste attendre la fin d'un thread, utilisez join () ou un futur.

6voto

Marcelo Cantos Points 91211

Il est dangereux de mettre fin à un thread de manière préventive en raison de l'état de l'ensemble du processus devient indéterminé après ce point. Le thread peut avoir acquis une section critique avant d'être interrompue. Cette section critique auront pas à être publié. Le tas pourrait devenir définitivement verrouillé, et ainsi de suite.

L' boost::thread::interrupt solution fonctionne en demandant gentiment. Il ne interrompre un thread de faire quelque chose des thats interruptible, comme en attente d'un coup de pouce.Fil de la variable de condition, ou si le thread n'a une de ces choses après une interruption est appelée. Même alors, le fil n'est pas sans ménagement mis dans le hachoir à viande comme, par exemple, Win32 l' TerminateThread fonction n'est, tout simplement, il induit une exception, qui, si vous avez été sage codeur et utilisé RAII partout, va nettoyer après lui-même et gracieusement à la sortie du fil.

5voto

Michael Aaron Safyan Points 45071

La mise en œuvre d'un do-it-yourself solution la plus logique, et il ne devrait vraiment pas être difficile de le faire. Vous aurez besoin d'une variable partagée-vous de lire/écrire de façon synchrone, en indiquant si le thread est en train d'être invité à se terminer, et votre thread lit régulièrement à partir de cette variable quand il est dans un état où il peut en toute sécurité être interrompu. Lorsque vous voulez interrompre un thread, il suffit d'écrire de manière synchrone à cette variable, puis vous rejoignez le fil. En supposant qu'il coopère de manière appropriée, il est à noter que la variable a été écrite et arrêter, résultant dans la fonction join n'est plus bloquant.

Si vous deviez aller à la maternelle, vous ne gagnerait rien en particulier; il vous suffit de jeter tous les avantages de la norme et de la croix-plate-forme de programmation orientée objet mécanisme de threading. Pour que votre code soit correct, le fil serait nécessaire d'arrêter la coopération, ce qui implique la communication décrit ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X