2010-12-15 6 views
2

Fondamentalement, je me demande si le filetage est utile ou nécessaire, ou peut-être plus spécifiquement les utilisations et les situations dans lesquelles vous l'utiliseriez. Je ne connais pas grand chose au sujet du threading, et je ne l'ai jamais utilisé (j'utilise principalement C#) et je me suis demandé s'il y avait des gains de performance ou de stabilité si vous les utilisiez. Si quelqu'un était si gentil à expliquer, je serais reconnaissant.Est-ce que le filetage est nécessaire/utile?

Répondre

6

Dans le monde des applications de bureau (mon domaine), le thread est un élément essentiel dans la création d'interfaces utilisateur réactives. Chaque fois qu'une opération gourmande en temps ou en calcul doit s'exécuter, il est presque essentiel d'exécuter cette opération dans un thread séparé. Sinon, l'interface utilisateur se verrouille et, dans certains cas, Windows décide que l'application entière ne répond plus.

Le filetage est également un outil essentiel dans l'animation, l'audio et les communications. Fondamentalement, toute situation dans laquelle vous avez besoin de faire plusieurs choses à la fois se prête à l'utilisation de threads.

+1

+1 Il est anecdotique, mais ouvrez le Gestionnaire des tâches sur une boîte de Windows. Dans le menu Affichage, ajoutez la colonne Threads à l'onglet Processus. Ce que vous verrez alors, c'est que la grande majorité des processus (90 +% habituellement) utilisent plusieurs threads. Sur ma boîte, 71 des 76 processus en cours (93%) sont multithread. –

+0

@Matt Davis: juste pour les statistiques: 55/58 fileté ici ;-) – zerkms

0

Voici un exemple simple de la façon dont le filetage peut améliorer les performances. Vous avez un n nombres que tous devaient être additionnés. Dans une application à un seul thread, il faudra n unités de temps pour ajouter tous les nombres ensemble pour la somme finale. Cependant, si vous avez divisé vos nombres en 2 groupes, vous pourriez avoir la même opération côte à côte avec, chacun avec un groupe de n/2 nombres. Chacun prendrait n/2 unités de temps pour trouver leurs sommes respectives, puis une unité supplémentaire pour trouver la somme complète. En créant deux threads, vous avez réduit le temps de calcul de moitié.

+0

'Ajouter 'ici semble pas un exemple approprié, à mon humble avis, puisque' +' est une opération très bon marché. Je pense que la compression vidéo pourrait être meilleure. – zerkms

+0

Correct, la compression vidéo est beaucoup plus lourde que l'addition. Mais il est beaucoup plus facile de voir que chaque opération d'addition est indépendante et ne nécessite aucune connaissance au-delà des mathématiques élémentaires pour comprendre le fait qu'il peut y avoir des gains drastiques dans le temps d'exécution. Une fois que le PO a compris le concept de base, il peut alors passer à des exemples plus compliqués où la taille de l'unité de temps est plus grande. – unholysampler

+4

Notez que l'hypothèse ici est que les deux threads tournent sur deux processeurs différents. Si les threads tournent sur le même processeur, il est évident que le temps total est plus long car vous avez tout le travail à faire, plus le travail supplémentaire de changement de contexte entre les threads. Idéalement, vous voulez * un thread par processeur * et chaque thread va 100% d'utilisation maximale du processeur; Si vous n'avez pas cela alors vous avez acheté trop de machines pour les problèmes que vous résolvez, ou les processus sont bloqués sur autre chose, comme l'accès au disque ou au réseau. –

1

il n'y a définitivement aucun gain à la stabilité :). Je vous suggère d'avoir une compréhension de base du filetage, mais ne sautez pas pour l'utiliser dans une application de production réelle jusqu'à ce que vous ayez un réel besoin. vous avez C# donc pas sûr si vous construisez des sites Web ou des winforms. Habituellement, le premier cas d'utilisation de threads pour les winforms est lorsqu'un utilisateur clique sur un bouton et que vous voulez exécuter une opération coûteuse (appel de base de données ou service web) mais vous ne voulez pas que l'écran se bloque. .

un bon tutoriel pour faire face à cette situation est de look at the backgroundworker class in c# que cela vous donnera une première saveur dans cet espace et vous pouvez aller de là

0

Techniquement sur un seul processeur, il n'y a pas une telle chose comme multi-threading, juste l'illusion que plusieurs tâches se passent en parallèle puisque chaque tâche prend un peu de temps. Toutefois, cela étant dit, le threading est très utile si vous devez effectuer un travail qui prend du temps mais que vous voulez que votre application soit réactive (c'est-à-dire capable de faire d'autres choses) pendant que vous attendez cette tâche. terminer. Un bon exemple est les applications GUI.

Sur les systèmes multi-core/multi-processeurs, vous pouvez avoir un processus faire beaucoup de choses à la fois si le gain de performance, il est évident :)

+1

Même sur un threading de noyau peut accélérer beaucoup l'exécution de l'application. Par exemple, lorsque vous travaillez avec une source de données tierce lente (ftp, http, hdd, etc.). – zerkms

1

Il fut un temps où nos applications accéléreraient lorsque nous déployons eux sur le nouveau CPU. Et cette accélération était en grande partie parce que la vitesse du processeur (horloge) a été augmentée par de grands facteurs. Mais il y a plusieurs années, les fabricants de processeurs cessaient d'augmenter les horloges d'UC en raison de limites physiques (par exemple la dissipation de la chaleur). Et à la place, ils ont commencé à ajouter des cœurs supplémentaires aux processeurs. Maintenant, si votre application ne s'exécute que sur un thread, elle ne peut pas tirer parti de l'unité centrale complète (par exemple, elle n'utilise qu'un seul 1 cœfficient de 4 cœurs).

Aujourd'hui, pour utiliser pleinement le processeur, nous devons faire des efforts et répartir la tâche sur plusieurs bandes de roulement. Pour ASP.NET, cela est déjà fait pour nous par l'architecture ASP.NET et IIS.

Regardez ici The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software