175 votes

Comment puis-je arrêter un thread en C++11?

Juste curieux. Ce n'est pas une question sur la façon de résilier le fil correctement, ou comment le fil doit être écrite pour le faire répondre à un "terminer la commande". Je suis intéressé par la terminaison du thread avec force à l'aide de pur C++11.

162voto

Howard Hinnant Points 59526
  1. Vous pourriez l'appeler std::terminate() à partir de n'importe quel fil et le fil que vous faites allusion à l'forcera la fin.

  2. Vous pouvez vous arranger pour ~thread() à exécuter sur l'objet du thread cible, sans intervenir join() ni detach() sur cet objet. Cela aura le même effet que l'option 1.

  3. Vous pouvez concevoir une exception qui a un destructeur qui lève une exception. Et puis prendre des dispositions pour le thread cible pour lever cette exception lorsqu'elle est fermée. La partie la plus délicate sur ce est le thread cible pour lever cette exception.

Les Options 1 et 2 n'a pas de fuite intra-processus de ressources, mais ils mettent fin à chaque thread.

Option 3 sera probablement une fuite de ressources, mais est partiellement coopérative en ce que le thread cible doit accepter de jeter l'exception.

Il n'y a pas de mobiles en C++11 (que je connais) à la non-collaboration de tuer un thread unique dans un environnement multi-thread programme (c'est à dire sans les tuer tous les threads). Il n'y a pas de motivation pour la conception d'une telle fonctionnalité.

Un std::thread peut avoir cette fonction de membre:

native_handle_type native_handle();

Vous pourriez être en mesure de l'utiliser pour appeler un OS dépendant de la fonction pour faire ce que vous voulez. Par exemple sur Apple OS, cette fonction existe et native_handle_type est pthread_t. Si vous avez réussi, vous êtes susceptible de fuite de ressources.

59voto

Nanno Langstraat Points 390

@Howard Hinnant la réponse est à la fois correct et complet. Mais il peut être mal compris, si c'est de lire trop rapidement, car std::terminate() (ensemble du processus) arrive à avoir le même nom que la "terminaison" que @AlexanderVX avait à l'esprit (1 fil).

Résumé: "mettre fin à 1 fil + force (thread cible n'est pas coopérer) + pur C++11 = Aucune façon."

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