Chapitre 9 Passer au niveau supérieur

 Passer au niveau supérieur

Petit cas d’illustration

Rien de tel qu’une belle métaphore pour expliquer ce concept. Imaginez que vous allez vous marier, et c’est le moment d’envoyer les invitations. Si vous êtes déjà marié, revenez quelques années en arrière à ce même moment. Et, si vous l’avez fait organiser par quelqu’un d’autre, imaginez que vous l’avez fait vous-même. Comme vous avez énormément d’amis, il y a environ un millier de lettres à envoyer. Vous vous munissez des enveloppes, des adresses, des timbres, et avec beaucoup de bonne volonté vous vous y mettez. Au bout d’un certain temps (qui pour moi serait inenvisageable, je dois l’avouer, je n’ai pas beaucoup de patience), finalement, vous aurez réussi à envoyer toutes les lettres. Maintenant, imaginez le même travail, sauf que vous avez un ami pour vous aider. Vous lui passez la moitié des enveloppes, la moitié des adresses, vous partagez les timbres, vous prenez bien soin de lui expliquer ce qu’il faut faire et vous vous y mettez à deux. Outre le fait que ce sera plus marrant et plus sympa, vous allez surtout mettre deux fois moins de temps. Pareil, mais avec vingt amis. Vous mettrez vingt fois moins de temps. En revanche, si on essayait avec cinq cents, on pourrait penser que cela prendrait cinq cents fois moins de temps mais, finalement, vous vous rendez compte que le temps d’expliquer à chacune des cinq cents personnes ce qu’il faut faire, vous auriez pu envoyer au moins cinq mille lettres. Il y a donc un nombre d’amis qui optimise le temps d’envoi de toutes vos lettres. Le multithreading, c’est exactement cela. j Les lettres à envoyer représentent le but de votre programme, ce qu’il doit faire. j Les enveloppes, les adresses et les timbres représentent les données. j Et vous et vos amis êtes des threads. (Ne vous inquiétez pas, on s’y fait bien !) r Mais vous avez vu qu’il a fallu expliquer à vos amis ce qu’il fallait faire. De la même manière, il vous faudra préparer les threads aux actions qu’ils devront effectuer. De plus, vous avez dû partager les enveloppes et les timbres. Pareillement, vous aurez à vous arranger pour partager les données entre les threads. En revanche, il n’est pas impossible qu’un de vos amis ait utilisé vos timbres parce qu’il n’en avait plus ou alors qu’il ait fini bien avant les autres. Cela peut arriver également au niveau des threads. Ils ne s’arrêteront pas en même temps et pourront être amenés à utiliser les mêmes données. Il s’agit là de la problématique principale du multithreading : l’accès concurrent aux données. En effet, la principale source d’erreur lorsque l’on traite du multithreading est due à des données modifiées par des threads alors qu’un autre thread s’en servait. Imaginez que vous vouliez enregistrer une émission à la télévision. Vous programmez l’enregistrement sur une chaîne donnée. Votre conjoint passe par là et change de chaîne pour regarder son émission. Et vous vous retrouvez avec le programme de cette chaîne plutôt que sur celui que vous vouliez enregistrer. Le problème a été posé par un accès concurrent à la télévision. Vous avez tous les deux voulu l’utiliser et le traitement de l’un a perturbé l’autre. Maintenant que nous avons vu la théorie sur ce qu’est le multithreading, faisons une application pour illustrer concrètement ce qui se passe.

Application explicative

Tout d’abord, créons un nouveau projet (voir Figure 9.76). 2 On l’appellera AppliTestMultiThread. Ce sera une application Console simple pour présenter le concept de multithreading (voir Figure 9.77). Garder l’interactivité avec l’utilisateur Dans un premier temps, notre application ne fera que boucler sur une valeur et l’écrire. Elle marquera ensuite la fin du programme, que nous finirons par un ReadLine pour que la fenêtre ne disparaisse pas tout de suite. Sub Main() Dim count As Integer = 0 Figure 9.76 : Création d’un nouveau projet Figure 9.77 : Nouvelle application Console. 276 LE GUIDE COMPLET Chapitre 9 Passer au niveau supérieur For i = 1 To 20 ’ Traitement à faire 100X ’count += 1 Console.WriteLine(« Dans le thread principal,i= » & i.ToString) Next i Console.WriteLine(« J’ai fini sans problème le thread principal. Nombre de traitement =  » & count.ToString) Console.ReadLine() End Sub L’exécution de ce programme devrait vous ressortir ceci : Utilisons maintenant dans ce même programme un autre thread qui va faire la même chose. Pour cela, il faut déclarer une méthode qui sera le point d’entrée du thread, c’est-à-dire la première qu’il va exécuter. Dans notre cas, on aura une méthode qui fera la même boucle que celle du programme principal en précisant que c’est celle du thread secondaire. Sub MakeLoop() Dim count As Integer = 0 For i = 1 To 20 count += 1 Console.WriteLine(« Dans le thread secondaire,i= » & i.ToString) Next i Figure 9.78 : Exécution du programme Garder l’interactivité avec l’utilisateur Chapitre 9 LE GUIDE COMPLET 277 Console.WriteLine(« J’ai fini sans problème le thread secondaire. Nombre de traitement =  » & count.ToString) End Sub Maintenant, pour utiliser un nouveau thread, il suffit tout simplement de l’instancier en précisant son point de départ, ici notre méthode MakeLoop. Il faut pour cela utiliser le mot-clé AddressOf suivi du nom de la méthode qui sera le point d’entrée. La classe de Thread est dans le namespace Threading. Ensuite, pour exécuter le thread il n’y a plus qu’à faire Start. Imports System.Threading Sub Main() Dim count As Integer = 0 Dim threadSecondaire As New Thread(AddressOf MakeLoop) threadSecondaire.Start() Console.WriteLine(« J’ai fini sans problème le thread principal. Nombre de traitement =  » & count.ToString) Console.ReadLine() End Sub

Très bien, nous avons réussi à produire du code dans un autre thread. Mais nous remarquons une chose, c’est que la phrase de fin du thread principal a été écrite avant la première phrase du thread secondaire. C’est tout à fait normal. Comme nous l’avons vu à la présentation du concept de thread, c’est un processus séparé. Le processus principal va donc continuer son exécution sans attendre le second thread. Celui-ci est bien exécuté en parallèle du premier. Tout cela est très bien, mais ici on a juste déplacé le traitement. Il y a effectivement deux threads, mais il n’y en a qu’un seul qui travaille réellement. Remettons alors notre boucle d’origine dans le programme principal. Cependant, pour que l’exemple soit plus parlant, il va falloir ajouter une instruction dans les boucles, Sleep. Cette instruction permet de stopper le thread qui l’exécute pendant un instant donné, calculé en millisecondes. En faisant cela, on simule un traitement long, car en réalité faire une boucle de 20 est tellement rapide que l’on ne verra pas les subtilités du multithreading. Sub Main() Dim count As Integer = 0 Dim threadSecondaire As New Thread(AddressOf MakeLoop) threadSecondaire.Start() For count = 1 To 20 ’count += 1 Thread.Sleep(0) Console.WriteLine(« Dans le thread principal,i= » & count.ToString) Next count Console.WriteLine(« J’ai fini sans problème le thread principal. Nombre de traitement =  » & count.ToString) Console.ReadLine() End Sub

Formation et coursTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *