Maintenant, cela peut être une question très novice, mais je n'ai pas vraiment d'expérience avec la programmation multithread et je n'ai pas entièrement compris comment les threads fonctionnent par rapport aux processus. Quand un processus sur ma machine se bloque, dis qu'il attend des E/S qui ne viennent jamais ou quelque chose de similaire, je peux les tuer et les redémarrer car les autres processus ne sont pas affectés et peuvent, par exemple, toujours faire fonctionner mon terminal. C'est très évident, bien sûr. Je ne suis pas sûr qu'il en soit de même avec les threads à l'intérieur d'un processus: Si l'un d'eux se bloque, les autres ne sont-ils pas affectés? En d'autres termes, puis-je lancer un thread "watchdog" qui supervise les autres threads et, par exemple tuer et recréer des threads suspendus? Par exemple, si j'ai un pool de threads que je ne veux pas être drainé par des interruptions occasionnelles.Quelle est l'indépendance des threads dans le même processus?
Répondre
Les threads sont indépendants, mais il existe une différence entre un processus et un thread, c'est-à-dire que dans le cas de processus, le système d'exploitation fait plus que le "tuer". Il nettoie aussi après. Si vous commencez à tuer des threads qui semblent être bloqués, vous laisserez probablement les ressources verrouillées et similaires, quelque chose que le système d'exploitation fermerait pour vous si vous faisiez de même pour un processus. Par exemple, si vous ouvrez un fichier pour écrire et que vous commencez à produire des données et que vous l'écrivez dans le fichier, et que ce thread se bloque, pour une raison quelconque, tuer le thread laissera le fichier ouvert, et probablement verrouillé, jusqu'à ce que vous fermez le programme entier. Donc, la vraie réponse à votre question est: Non, vous ne pouvez pas tuer les threads à la dure.Si vous demandez simplement à un thread de se fermer, c'est différent parce que le thread est toujours en contrôle et peut nettoyer et fermer les ressources avant de terminer, mais appeler une fonction API comme "KillThread" ou similaire est mauvais.
Si un thread se bloque, les autres continueront à s'exécuter. Cependant, si le thread suspendu a verrouillé un sémaphore, une section critique ou un autre type d'objet de synchronisation, et qu'un autre thread tente de verrouiller le même objet de synchronisation, vous avez maintenant un interblocage avec deux threads morts.
Il est possible de surveiller d'autres threads à partir d'un thread. En fonction de votre plate-forme, il existe des API utilisables: je vous renvoie à celles-ci car vous n'avez pas indiqué pour quel OS vous écrivez.
Merci, ma question était plus conceptuelle que pour un OS/langage/API spécifique –
Vous n'avez pas mentionné la plate-forme, mais en ce qui me concerne, le noyau NT planifie les threads, pas les processus et les menace de manière indépendante de cette manière. Cela peut ne pas être et n'est pas vrai sur d'autres plateformes (certaines plateformes, comme Windows 3.1, n'utilisent pas le multithreading préemptif et si un thread passe en boucle infinie, tout est affecté).
La réponse simple est oui.
Généralement, bien que le code dans un thread gère lui-même ce capot probable. Le plus souvent, de nombreuses API qui effectuent des opérations susceptibles de se bloquer auront leurs propres fonctionnalités de temporisation.
Sinon, un thread attendra non seulement l'opération qui risque de se bloquer, mais aussi une temporisation. Si la minuterie signale d'abord son fonctionnement, l'opération s'est interrompue. Etant donné que pour un chien de garde utile dans ce scénario, il faudrait une certaine coopération de la part du code dans les autres threads, les threads ayant eux-mêmes réglé les délais d'attente ayant plus de sens qu'un chien de garde.
Les fils sont planifiés indépendamment les uns des autres. Vous pouvez donc arrêter et redémarrer les threads suspendus. Les threads ne s'exécutent pas dans un espace d'adressage séparé, de sorte qu'un thread qui se comporte mal peut toujours écraser la mémoire ou prendre les verrous nécessaires aux autres threads dans le même processus.
Il y a un bon aperçu de certains des pièges de la suppression et de la suspension des threads dans la documentation Java, expliquant pourquoi les méthodes qui le font sont obsolètes. Fondamentalement, si vous pensez être capable de tuer un thread, vous devez être très, très prudent pour le faire fonctionner sans une sorte de corruption. Si un thread est bloqué, c'est probablement à cause d'un bug ... dans ce cas, le tuer entraînera probablement une corruption.
http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
Si vous devez être capable de tuer les choses, les processus d'utilisation.
- 1. Est-ce que plusieurs versions d'une même DLL (Boost) peuvent coexister dans le même processus?
- 2. Énumération des threads dans Windows
- 3. En C#, si 2 processus sont la lecture et l'écriture dans le même fichier, quelle est la meilleure façon d'éviter des exceptions de blocage du processus?
- 4. killall sur le processus du même nom
- 5. Planification des threads Swingworker
- 6. Processus de threads à exécution longue sous ASP.NET + WCF
- 7. Création de threads dans le cluster
- 8. Comment gérer la même socket dans différents threads?
- 9. MapViewOfFile avec des pointeurs entre les threads
- 10. Le threads EPiServer est-il sécurisé?
- 11. Envoyer des tableaux d'octets volumineux entre AppDomains dans le même processus
- 12. Quelle est la meilleure façon de gérer le regroupement de connexions à l'aide de threads?
- 13. Quelle est la meilleure façon d'exécuter un processus continu dans son propre thread?
- 14. Interruption des threads natifs
- 15. Trouver l'utilisation des ressources (CPU et mémoire) par les threads d'un processus dans unix (solaris/linux)
- 16. Comment faire pour exécuter plusieurs processus/threads/frontends Tornado?
- 17. Quel est le mécanisme sous-jacent utilisé pour communiquer entre les domaines d'application .Net dans le même processus?
- 18. AOP peut être utilisé pour partager des données entre différents threads en cours d'exécution dans le processus de demande?
- 19. Quelle est la méthode la plus simple de communication inter-processus entre 2 processus C#?
- 20. Auto-réparation des threads Python
- 21. Même DLL chargée deux fois dans un processus
- 22. Quel est le meilleur mécanisme pour communiquer des processus croisés dans Windows CE?
- 23. Quelle est la méthode à jeun pour passer des messages entre différents processus en C#?
- 24. IOCP dans le pool de threads personnalisés
- 25. Le sous-processus de Python.Popen renvoie la même sortie stdout même si elle ne devrait pas
- 26. Connexion des threads dans une application Rails
- 27. Le contenu est le même dans les deux classes ul
- 28. Gestion des paramètres dans les threads
- 29. Débogage des threads C#
- 30. Utilisation correcte des threads dans Scheme (Bigloo)
Très belle réponse, en particulier la mention thread/process. En bref, l'OS nettoie après un processus et il ne nettoie pas après un fil! –