Question Pourquoi devrais-je utiliser un thread plutôt que d'utiliser un processus?


Séparer les différentes parties d'un programme en différents processus semble (à mon sens) faire un programme plus élégant que de simplement tout enfiler. Dans quel scénario serait-il judicieux de faire tourner les choses sur un fil plutôt que de séparer le programme en différents processus? Quand devrais-je utiliser un fil?


modifier

Il serait également utile de savoir comment (ou si) ils agissent différemment avec un seul cœur et plusieurs cœurs.


37
2018-03-06 06:02


origine


Réponses:


Vous préférez plusieurs threads sur plusieurs processus pour deux raisons:

  1. La communication inter-thread (partage de données, etc.) est beaucoup plus simple à programmer que la communication inter-processus.
  2. Les changements de contexte entre les threads sont plus rapides qu'entre les processus. Autrement dit, il est plus rapide pour le système d'exploitation d'arrêter un thread et de commencer à en exécuter un autre que de faire la même chose avec deux processus.

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 correcteur orthographique de MS Office, par exemple, est un thread distinct de celui exécutant l'interface utilisateur Office. Dans ces applications, l'utilisation de plusieurs processus à la place entraînerait des performances et un code plus lents, difficiles à écrire et à gérer.


67
2018-03-06 06:05



En dehors des avantages de l'utilisation du processus de thread-over, comme:

Avantages:

  • Beaucoup plus rapide pour créer un fil que un processus.
  • Beaucoup plus rapide à changer entre les threads que de changer entre les processus.
  • Les threads partagent des données facilement

Considérez aussi quelques inconvénients:

  • Pas de sécurité entre les threads.
  • Un thread peut piétiner un autre thread Les données.
  • Si un thread bloque, tous threads dans le bloc de tâches.

En ce qui concerne la partie importante de votre question "Quand devrais-je utiliser un fil?"

Eh bien, vous devriez considérer 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 une solution élégante aux problèmes liés aux performances. Voici quelques exemples de situations où vous pourriez utiliser des threads:

  • Traitement long: lorsqu'une application Windows calcule, il ne peut plus traiter de messages. Par conséquent, l'affichage ne peut pas être mis à jour.
  • Faire du traitement en arrière-plan: certains tâches peuvent ne pas être temps critique, mais besoin d'exécuter en continu.
  • Faire le travail I / O: E / S sur disque ou à réseau peut avoir imprévisible retards. Les threads vous permettent de vous assurer que la latence d'E / S ne retarde pas parties non liées de votre application.

27
2018-03-06 06:20



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 des deux serait le partage de données.

L'utilisation d'un processus signifie que vous avez également besoin d'Inter Process Communication (IPC) pour obtenir et extraire des données du processus. C'est une bonne chose si le processus doit être isolé cependant.


6
2018-03-06 06:06



Vous ne sonnez 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 des threads de manière superflue peut aussi sembler rendre votre programme plus facile à lire et à écrire, car vous pouvez partager librement des variables et de la mémoire entre les threads. En pratique, cela nécessite une attention particulière pour éviter les conditions de course ou les impasses.

Il existe des noyaux de système d’exploitation (notamment L4) qui s'efforcent d'améliorer l'efficacité de la communication inter-processus. Pour de tels systèmes, on pourrait probablement faire valoir un argument convaincant selon lequel les threads sont inutiles.


6
2018-03-06 06:45



En plus des autres réponses, la maintenance et le déploiement d'un processus unique sont beaucoup plus simples que d'avoir quelques exécutables.

On utiliserait plusieurs processus / exécutables pour fournir une interface / un découplage bien défini afin que l’une ou l’autre partie puisse être réutilisée ou réimplémentée plus facilement que de conserver toutes les fonctionnalités en un seul processus.


2
2017-07-10 13:55



Je suis d'accord avec la plupart des réponses ci-dessus. Mais du point de vue de la conception, je préférerais opter pour un fil lorsque je souhaite que les opérations logiquement associées soient exécutées en parallèle. Par exemple, si vous exécutez un traitement de texte, un thread s'exécutera en avant-plan en tant qu'éditeur et un autre thread en arrière-plan enregistre automatiquement le document à intervalles réguliers.


2
2017-09-15 15:40