Ce qu'il faut noter ici, c'est que d'autres threads sont attachés au thread où se trouve la fonction Main(). La fonction Main() est l'entrée du programme C#. Le thread de départ peut être appelé le thread principal. tous les threads de premier plan sont arrêtés, puis le thread principal peut être terminé et tous les threads d'arrière-plan seront terminés sans condition. Bien que tous les threads soient exécutés en série d’un point de vue micro, vous pouvez les considérer comme s’exécutant en parallèle d’un point de vue macro.
Les lecteurs doivent avoir remarqué la propriété Thread.ThreadState. Cette propriété représente l'état d'exécution du thread. Elle a des valeurs différentes dans différentes circonstances, nous pouvons donc parfois concevoir en jugeant la valeur du flux du programme. . Les valeurs possibles de ThreadState dans diverses situations sont les suivantes :
Aborted : le thread s'est arrêté
AbortRequested : la méthode Thread.Abort() du thread a été appelée, mais le thread ne s'est pas encore arrêté
Background : le thread s'exécute en arrière-plan, lié à la propriété Thread.IsBackground
Running : le thread fonctionne normalement
Stopped : le thread a été arrêté
StoPRequested : il est demandé au thread de stop
Suspendu : le thread a été suspendu (dans cet état, vous pouvez le réexécuter en appelant la méthode Resume())
SuspendRequested : le thread demande à être suspendu, mais il n'y aura aucune réponse dans le futur
Non démarré : Thread.Start() n'est pas appelé pour démarrer l'exécution du thread
WaitSleepJoin : Le thread est dans un état bloqué en raison de l'appel de méthodes telles que Wait(), Sleep() ou Join()
L'état d'arrière-plan mentionné ci-dessus indique que le fil s'exécute en arrière-plan, alors quelle est la particularité du fil s'exécutant en arrière-plan ? Où est l'endroit ? En fait, il n'y a qu'une seule différence entre les threads d'arrière-plan et les threads de premier plan, c'est-à-dire que les threads d'arrière-plan n'empêchent pas l'arrêt du programme. Une fois que tous les threads de premier plan d'un processus sont terminés, le CLR (Common Language Runtime Environment) mettra complètement fin au processus en appelant la méthode Abort() de tout processus d'arrière-plan survivant.
Lorsque les threads se disputent le temps CPU, le CPU fournit des services en fonction de la priorité du thread. Dans les applications C#, les utilisateurs peuvent définir 5 priorités différentes, de élevée à faible, à savoir la plus élevée, la plus haute, la normale, la plus basse et la plus basse. Si la priorité n'est pas spécifiée lors de la création d'un thread, la valeur par défaut du système est ThreadPriority.Normal. Pour attribuer une priorité à un fil
, on peut utiliser le code suivant :
//Définir la priorité au plus bas
myThread.Priority=ThreadPriority.Lowest;
En définissant la priorité du fil de discussion, nous pouvons faire en sorte que certains fils de discussion relativement importants soient exécutés en premier, comme répondre aux utilisateurs, etc.
Maintenant que nous avons une compréhension préliminaire de la façon de créer et de contrôler un thread, nous allons approfondir les problèmes les plus typiques de l'implémentation des threads et explorer leurs solutions.
3. Synchronisation et communication des threads - producteurs et consommateurs
Supposons une situation où deux threads maintiennent une file d'attente en même temps Si un thread ajoute des éléments à la file d'attente, et un autre thread. prend les éléments de la file d'attente, puis nous appelons le thread qui ajoute l'élément un producteur et le thread qui prend l'élément un consommateur. Le problème producteur-consommateur semble simple, mais c'est un problème qui doit être résolu dans les applications multithread. Il implique des problèmes de synchronisation et de communication entre les threads.
Comme mentionné précédemment, chaque thread a ses propres ressources, mais la zone de code est partagée, c'est-à-dire que chaque thread peut exécuter la même fonction. Cependant, dans un environnement multithread, un problème possible est que plusieurs threads exécutent une fonction en même temps, provoquant une confusion des données et des résultats imprévisibles. Nous devons donc éviter cette situation. C# fournit un verrou par mot clé, qui peut définir une section de code comme une section mutuellement exclusive (section critique). La section mutuellement exclusive permet à un seul thread d'entrer en exécution à la fois, tandis que les autres threads doivent attendre. En C#, le mot-clé lock est défini comme suit :
lock(expression) Statement_block
Ce qui précède est le contenu de l'exploration préliminaire du mécanisme multi-thread de C# (3). Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !