Séparer les différentes parties d'un programme en différents processus me semble (pour moi) un programme plus élégant que de simplement tout enfiler. Dans quel scénario aurait-il un sens de faire fonctionner les choses sur un thread plutôt que de séparer le programme en différents processus? Quand devrais-je utiliser un fil?
Il serait également utile de savoir comment (ou si) ils agissent différemment avec les systèmes monocœur et multicœur.
Vous préféreriez plusieurs threads à plusieurs processus pour deux raisons:
Exemple:
Les applications avec interface graphique utilisent généralement un thread pour l'interface graphique et d'autres pour le calcul en arrière-plan. Le vérificateur orthographique dans MS Office, par exemple, est un thread distinct de celui qui exécute l'interface utilisateur Office. Dans de telles applications, l'utilisation de plusieurs processus entraînerait une performance plus lente et un code difficile à écrire et à maintenir.
Bien en dehors des avantages de l’utilisation de thread over process, comme:
Avantages:
Considérez aussi quelques inconvénients:
En ce qui concerne la partie importante de votre question "Quand devrais-je utiliser un fil?"
Eh bien, vous devez prendre en compte quelques faits qu'un thread ne doit pas modifier la sémantique d'un programme. Ils changent simplement le calendrier des opérations. En conséquence, ils sont presque toujours utilisés comme solution élégante aux problèmes de performances. Voici quelques exemples de situations dans lesquelles vous pourriez utiliser des threads:
Je suppose que vous savez déjà que vous avez besoin d'un thread ou d'un processus, alors je dirais que la principale raison de choisir l'un sur l'autre est le partage de données.
L'utilisation d'un processus signifie que vous avez également besoin de la communication inter-processus (IPC) pour obtenir des données dans et hors du processus. C’est une bonne chose si le processus doit être isolé.
Vous ne parlez pas comme un débutant. C'est une excellente observation que les processus sont, à bien des égards, plus élégants. Les threads sont fondamentalement une optimisation pour éviter trop de transitions ou trop de communication entre les espaces mémoire.
Utiliser superficiellement des threads peut également sembler faciliter la lecture et l’écriture de votre programme, car vous pouvez partager librement des variables et de la mémoire entre les threads. En pratique, cela nécessite une attention toute particulière pour éviter les situations de course ou les blocages.
Il existe des noyaux de systèmes d'exploitation (notamment L4 ) qui s'efforcent d'améliorer l'efficacité de la communication interprocessus. Pour de tels systèmes, on pourrait probablement argumenter de manière convaincante que les threads sont inutiles.
Je suis d'accord avec la plupart des réponses ci-dessus. Mais du point de vue de la conception, je préférerais un fil lorsque je souhaite effectuer un ensemble d’opérations logiquement liées en parallèle. Par exemple, si vous exécutez un traitement de Word, un thread fonctionnera au premier plan en tant qu'éditeur et un autre exécutera en arrière-plan, enregistrant automatiquement le document à intervalles réguliers afin que personne ne puisse concevoir un processus permettant d'effectuer cette tâche d'enregistrement séparément.
Outre les autres réponses, la maintenance et le déploiement d'un processus unique sont beaucoup plus simples que de disposer de quelques exécutables.
On utiliserait plusieurs processus/exécutables pour fournir une interface/découplage bien définie, de sorte qu'une partie ou l'autre puisse être réutilisée ou réimplémentée plus facilement que de conserver toutes les fonctionnalités dans un processus.
Entré dans ce post. Discussion intéressante. mais j'ai senti un point manque ou indirectement.
La création d'un nouveau processus est coûteuse à cause de toutes les structuresdata qui doivent être allouées et initialisées. Le processus est subdivisé en différents threads de contrôle pour permettre le multithreading au sein du processus.
L'utilisation d'un thread ou d'un processus pour atteindre la cible dépend des exigences de votre programme et de l'utilisation des ressources.