Partager via


Threads et filature

Le multithreading vous permet d’augmenter la réactivité de votre application et, si votre application s’exécute sur un système multiprocesseur ou multicœur, augmentez son débit.

Processus et threads

Un processus est un programme en cours d’exécution. Un système d’exploitation utilise des processus pour séparer les applications en cours d’exécution. Un thread est l’unité de base à laquelle un système d’exploitation alloue du temps processeur. Chaque thread a une priorité de planification et gère un ensemble de structures que le système utilise pour enregistrer le contexte de thread lorsque l’exécution du thread est suspendue. Le contexte de thread inclut toutes les informations dont le thread a besoin pour reprendre en toute transparence l’exécution, y compris l’ensemble des registres de processeur et de la pile du thread. Plusieurs threads peuvent s’exécuter dans le contexte d’un processus. Tous les threads d’un processus partagent son espace d’adressage virtuel. Un thread peut exécuter n’importe quelle partie du code du programme, y compris les parties en cours d’exécution par un autre thread.

Remarque

.NET Framework offre un moyen d’isoler les applications au sein d’un processus avec l’utilisation des domaines d’application. (Les domaines d’application ne sont pas disponibles sur .NET Core.) Pour plus d’informations, consultez la section Domaines et threads d’application de l’article Domaines d’application .

Par défaut, un programme .NET est démarré avec un seul thread, souvent appelé thread principal . Toutefois, il peut créer des threads supplémentaires pour exécuter du code en parallèle ou simultanément avec le thread principal. Ces threads sont souvent appelés threads de travailleur.

Quand utiliser plusieurs threads

Vous utilisez plusieurs threads pour augmenter la réactivité de votre application et tirer parti d’un système multiprocesseur ou multicœur pour augmenter le débit de l’application.

Considérez une application de bureau, dans laquelle le thread principal est responsable des éléments d’interface utilisateur et répond aux actions utilisateur. Utilisez des threads de travail pour effectuer des opérations fastidieuses qui, sinon, occupent le thread principal et rendent l’interface utilisateur non réactive. Vous pouvez également utiliser un thread dédié pour la communication réseau ou appareil afin d’être plus réactif aux messages ou événements entrants.

Si votre programme effectue des opérations qui peuvent être effectuées en parallèle, le temps d’exécution total peut être réduit en effectuant ces opérations dans des threads distincts et en exécutant le programme sur un système multiprocesseur ou multicœur. Sur ce système, l’utilisation de multithreading peut augmenter le débit, ainsi que la réactivité accrue.

Utilisation de multithreading dans .NET

À compter de .NET Framework 4, la méthode recommandée pour utiliser le multithreading consiste à utiliser la bibliothèque parallèle de tâches (TPL) et parallel LINQ (PLINQ) . Pour plus d’informations, consultez Programmation parallèle.

TPL et PLINQ s’appuient sur les ThreadPool threads. La System.Threading.ThreadPool classe fournit une application .NET avec un pool de threads de travail. Vous pouvez aussi utiliser des threads de pool de threads. Pour plus d’informations, consultez le pool de threads managés.

Enfin, vous pouvez utiliser la System.Threading.Thread classe qui représente un thread managé. Pour plus d’informations, consultez Utilisation des threads et du multithreading.

Plusieurs threads peuvent avoir besoin d’accéder à une ressource partagée. Pour conserver la ressource dans un état non endommagé et éviter les conditions de concurrence, vous devez synchroniser l’accès au thread. Vous pouvez également coordonner l’interaction de plusieurs threads. .NET fournit une plage de types que vous pouvez utiliser pour synchroniser l’accès à une ressource partagée ou coordonner l’interaction de thread. Pour plus d’informations, consultez Vue d’ensemble des primitives de synchronisation.

Gérez les exceptions dans les threads. Les exceptions non gérées dans les threads terminent généralement le processus. Pour plus d’informations, consultez Exceptions dans les threads managés.

Voir aussi