Threads et threadingThreads and Threading

Les systèmes d’exploitation utilisent des processus pour séparer les différentes applications qu’ils exécutent.Operating systems use processes to separate the different applications that they are executing. Les threads sont l’unité de base à laquelle un système d’exploitation alloue du temps processeur, et plusieurs threads peuvent exécuter du code au sein de ce processus.Threads are the basic unit to which an operating system allocates processor time, and more than one thread can be executing code inside that process. Chaque thread maintient des gestionnaires d’exceptions, une priorité de planification et un ensemble de structures utilisé par le système pour enregistrer le contexte du thread jusqu'à sa planification.Each thread maintains exception handlers, a scheduling priority, and a set of structures the system uses to save the thread context until it is scheduled. Le contexte du thread comprend toutes les informations dont le thread a besoin pour reprendre l’exécution sans interruption, notamment son ensemble de registres d’UC et de pile, dans l’espace d’adressage de son processus hôte.The thread context includes all the information the thread needs to seamlessly resume execution, including the thread's set of CPU registers and stack, in the address space of the thread's host process.

.NET Framework subdivise chaque processus de système d’exploitation en plusieurs sous-processus gérés et légers, appelés domaines d’application et représentés par System.AppDomain.The .NET Framework further subdivides an operating system process into lightweight managed subprocesses, called application domains, represented by System.AppDomain. Un ou plusieurs threads managés (représentés par System.Threading.Thread) peuvent s’exécuter dans un ou plusieurs domaines d’application, au sein du même processus géré.One or more managed threads (represented by System.Threading.Thread) can run in one or any number of application domains within the same managed process. Bien que chaque domaine d’application démarre avec un seul thread, le code qu’il contient permet de créer des domaines d’application et des threads supplémentaires.Although each application domain is started with a single thread, code in that application domain can create additional application domains and additional threads. Par conséquent, un thread managé peut se déplacer librement entre les domaines d’application d’un même processus géré ; il est possible de n’avoir qu’un seul thread qui évolue entre différents domaines d’application.The result is that a managed thread can move freely between application domains inside the same managed process; you might have only one thread moving among several application domains.

Un système d’exploitation qui prend en charge le mode multitâche préemptif produit l’effet d’une exécution simultanée de plusieurs threads provenant de plusieurs processus.An operating system that supports preemptive multitasking creates the effect of simultaneous execution of multiple threads from multiple processes. Pour cela, il répartit le temps processeur disponible entre les threads qui en ont besoin, en allouant une tranche de temps à chaque thread les uns après les autres.It does this by dividing the available processor time among the threads that need it, allocating a processor time slice to each thread one after another. Le thread en cours d’exécution est suspendu lorsque sa tranche de temps est écoulée et un autre thread reprend l’exécution.The currently executing thread is suspended when its time slice elapses, and another thread resumes running. Lorsque le système passe d’un thread à un autre, il enregistre le contexte du thread préempté et recharge le contexte enregistré du thread suivant dans la file d’attente de threads.When the system switches from one thread to another, it saves the thread context of the preempted thread and reloads the saved thread context of the next thread in the thread queue.

La longueur de chaque tranche de temps dépend du système d’exploitation et du processeur.The length of the time slice depends on the operating system and the processor. Dans la mesure où elle est petite, plusieurs threads semblent s’exécuter en même temps, même s’il n’y a qu’un processeur.Because each time slice is small, multiple threads appear to be executing at the same time, even if there is only one processor. C’est le cas sur les systèmes multiprocesseurs, où les threads exécutables sont distribués entre les processeurs disponibles.This is actually the case on multiprocessor systems, where the executable threads are distributed among the available processors.

Quand utiliser plusieurs threadsWhen To Use Multiple Threads

Les logiciels qui nécessitent l’intervention de l’utilisateur doivent réagir aussi vite que possible aux activités de l’utilisateur pour offrir une expérience utilisateur riche.Software that requires user interaction must react to the user's activities as rapidly as possible to provide a rich user experience. Il doit cependant effectuer en même temps les calculs nécessaires pour présenter les données à l’utilisateur aussi rapidement que possible.At the same time, however, it must do the calculations necessary to present data to the user as fast as possible. Si votre application utilise un seul thread d’exécution, vous pouvez combiner la programmation asynchrone avec la communication à distance .NET Framework ou des services web XML créés à l’aide d’ASP.NET pour utiliser le temps de traitement d’autres ordinateurs en plus des vôtres afin d’augmenter la réactivité vis-à-vis de l’utilisateur et de réduire le temps de traitement des données de votre application.If your application uses only one thread of execution, you can combine asynchronous programming with.NET Framework remoting or XML Web services created using ASP.NET to use the processing time of other computers in addition to that of your own to increase responsiveness to the user and decrease the data processing time of your application. Si vous effectuez des opérations riches en entrées/sorties, vous pouvez également utiliser des ports d’achèvement d’E/S pour accroître la rapidité de réaction de votre application.If you are doing intensive input/output work, you can also use I/O completion ports to increase your application's responsiveness.

Avantages des threads multiplesAdvantages of Multiple Threads

L’utilisation de plusieurs threads, toutefois, est la technique la plus puissante qui soit pour augmenter la réactivité vis-à-vis de l’utilisateur et traiter les données nécessaires pour effectuer le travail presque en même temps.Using more than one thread, however, is the most powerful technique available to increase responsiveness to the user and process the data necessary to get the job done at almost the same time. Sur un ordinateur doté d’un seul processeur, plusieurs threads peuvent créer cet effet, en tirant parti des courts laps de temps entre les événements utilisateur pour traiter les données en arrière-plan.On a computer with one processor, multiple threads can create this effect, taking advantage of the small periods of time in between user events to process the data in the background. Par exemple, un utilisateur peut modifier une feuille de calcul tandis qu’un autre thread recalcule d’autres parties de cette feuille de calcul au sein de la même application.For example, a user can edit a spreadsheet while another thread is recalculating other parts of the spreadsheet within the same application.

Sans modification, la même application augmenterait considérablement la satisfaction utilisateur si elle s’exécutait sur un ordinateur doté de plusieurs processeurs.Without modification, the same application would dramatically increase user satisfaction when run on a computer with more than one processor. Votre domaine d’application unique pourrait utiliser plusieurs threads pour accomplir les tâches suivantes :Your single application domain could use multiple threads to accomplish the following tasks:

  • communiquer sur un réseau, avec un serveur web et une base de données ;Communicate over a network, to a Web server, and to a database.

  • effectuer des opérations qui prennent beaucoup de temps ;Perform operations that take a large amount of time.

  • différencier des tâches de priorités différentesDistinguish tasks of varying priority. (par exemple, un thread prioritaire gère les tâches soumises à des contraintes de temps, et un thread de priorité inférieure effectue d’autres tâches) ;For example, a high-priority thread manages time-critical tasks, and a low-priority thread performs other tasks.

  • autoriser l’interface utilisateur à rester réactive, tout en allouant du temps aux tâches en arrière-plan.Allow the user interface to remain responsive, while allocating time to background tasks.

Inconvénients des threads multiplesDisadvantages of Multiple Threads

Il est recommandé d’utiliser aussi peu de threads que possible, afin de limiter l’exploitation des ressources du système d’exploitation et d’améliorer les performances.It is recommended that you use as few threads as possible, thereby minimizing the use of operating-system resources and improving performance. Le threading est également soumis à des critères de ressources ; par ailleurs, il faut prendre en considération les conflits potentiels au moment de concevoir une application.Threading also has resource requirements and potential conflicts to be considered when designing your application. Voici les exigences en matière de ressources :The resource requirements are as follows:

  • Le système utilise la mémoire pour les informations de contexte requises par les processus, les objets AppDomain et les threads.The system consumes memory for the context information required by processes, AppDomain objects, and threads. Par conséquent, le nombre de processus, d’objets AppDomain et de threads qu’il est possible de créer est limité par la mémoire disponible.Therefore, the number of processes, AppDomain objects, and threads that can be created is limited by available memory.

  • Le fait de suivre un grand nombre de threads consomme un temps processeur non négligeable.Keeping track of a large number of threads consumes significant processor time. S’il y a trop de threads, la plupart d'entre eux progresseront à peine.If there are too many threads, most of them will not make significant progress. Si la majorité des threads en cours se trouvent dans un même processus, les threads des autres processus sont planifiés à une fréquence moindre.If most of the current threads are in one process, threads in other processes are scheduled less frequently.

  • Il est difficile de contrôler l’exécution du code avec de nombreux threads, qui peut être source de nombreux bogues.Controlling code execution with many threads is complex, and can be a source of many bugs.

  • Détruire des threads implique de savoir ce qui pourrait se produire et de gérer ces problèmes.Destroying threads requires knowing what could happen and handling those issues.

L’accès partagé aux ressources risque de créer des conflits.Providing shared access to resources can create conflicts. Pour les éviter, il faut synchroniser ou contrôler l’accès aux ressources partagées.To avoid conflicts, you must synchronize, or control the access to, shared resources. À défaut d’une synchronisation appropriée (dans le même domaine d’application ou non), des problèmes peuvent survenir, par exemple, des blocages (deux threads cessent de répondre, chacun dans l’attente que l’autre se termine) et des conditions de concurrence (un résultat anormal se produit en raison d’une dépendance critique inattendue à la synchronisation de deux événements).Failure to synchronize access properly (in the same or different application domains) can lead to problems such as deadlocks (in which two threads stop responding while each waits for the other to complete) and race conditions (when an anomalous result occurs due to an unexpected critical dependence on the timing of two events). Le système fournit des objets de synchronisation permettant de coordonner le partage de ressources entre différents threads.The system provides synchronization objects that can be used to coordinate resource sharing among multiple threads. La réduction du nombre de threads facilite la synchronisation des ressources.Reducing the number of threads makes it easier to synchronize resources.

Les ressources suivantes nécessitent une synchronisation :Resources that require synchronization include:

  • ressources système (p. ex., ports de communication) ;System resources (such as communications ports).

  • ressources partagées par plusieurs processus (p. ex., descripteurs de fichiers) ;Resources shared by multiple processes (such as file handles).

  • ressources d’un seul domaine d’application (p. ex., champs globaux, statiques et d’instance) auxquelles accèdent plusieurs threads.The resources of a single application domain (such as global, static, and instance fields) accessed by multiple threads.

Threading et de conception d’applicationsThreading and Application Design

En général, la classe ThreadPool représente le moyen le plus simple de gérer plusieurs threads pour des tâches relativement courtes qui ne bloquent pas d’autres threads et si vous ne prévoyez aucune planification particulière des tâches.In general, using the ThreadPool class is the easiest way to handle multiple threads for relatively short tasks that will not block other threads and when you do not expect any particular scheduling of the tasks. Toutefois, il y a différentes raisons de créer ses propres threads :However, there are a number of reasons to create your own threads:

  • Vous voulez qu’une tâche ait une priorité particulière.If you need a task to have a particular priority.

  • L’exécution d’une tâche risque de prendre longtemps (ce qui bloquerait d’autres tâches).If you have a task that might run a long time (and therefore block other tasks).

  • Vous devez placer des threads dans un thread unique cloisonné (tous les threads ThreadPool se trouvent dans le multithread cloisonné).If you need to place threads into a single-threaded apartment (all ThreadPool threads are in the multithreaded apartment).

  • Vous avez besoin d’une identité stable associée au thread.If you need a stable identity associated with the thread. Par exemple, vous devez utiliser un thread dédié pour abandonner ce thread, le suspendre ou l’identifier par son nom.For example, you should use a dedicated thread to abort that thread, suspend it, or discover it by name.

  • Si vous avez besoin d’exécuter des threads d’arrière-plan qui interagissent avec l’interface utilisateur, la version 2.0 de .NET Framework fournit un composant BackgroundWorker qui communique à l’aide d’événements, avec un marshaling interthread vers le thread d’interface utilisateur.If you need to run background threads that interact with the user interface, the .NET Framework version 2.0 provides a BackgroundWorker component that communicates using events, with cross-thread marshaling to the user-interface thread.

Threading et exceptionsThreading and Exceptions

Ne gérez pas les exceptions dans les threads.Do handle exceptions in threads. En règle générale, les exceptions non prises en charge dans les threads, même d’arrière-plan, mettent fin au processus.Unhandled exceptions in threads, even background threads, generally terminate the process. Il existe trois exceptions à cette règle :There are three exceptions to this rule:

Pour plus d'informations, voir Exceptions dans les threads managés.For more information, see Exceptions in Managed Threads.

Note

Dans les versions 1.0 et 1.1 de .NET Framework, le common language runtime intercepte sans assistance certaines exceptions, par exemple dans les threads de pool.In the .NET Framework versions 1.0 and 1.1, the common language runtime silently traps some exceptions, for example in thread pool threads. Cela risque d’endommager l'état des applications et de finir par provoquer leur blocage, ce qui peut être très difficile à déboguer.This may corrupt application state and eventually cause applications to hang, which might be very difficult to debug.

Voir aussiSee Also

ThreadPool
BackgroundWorker
Synchronisation des données pour le multithreadingSynchronizing Data for Multithreading
Pool de threads managésThe Managed Thread Pool