Synchronisation des threads
Mise à jour : novembre 2007
Lorsque vous écrivez une application à threads, vous pouvez être amené à synchroniser différents threads séparés avec d'autres parties de votre programme. La synchronisation apporte un compromis entre la nature non structurée de la programmation multithread et l'ordre structuré du traitement synchrone.
Vous utilisez les techniques de synchronisation pour :
contrôler explicitement l'ordre d'exécution du code dès que des tâches doivent être effectuées dans une séquence déterminée ;
- ou -
pour empêcher les problèmes qui peuvent se produire lorsque deux threads partagent simultanément une même ressource.
Par exemple, vous pouvez utiliser la synchronisation pour forcer une procédure d'affichage à attendre la fin d'une procédure de récupération de données qui s'exécute sur un autre thread.
Techniques de synchronisation
Il existe deux approches en matière de synchronisation, l'interrogation et la manipulation d'objets de synchronisation. Pour plus d'informations sur les objets de synchronisation, consultez Techniques avancées de synchronisation.
Interrogation
L'interrogation répétée permet de vérifier l'état d'un appel asynchrone à partir d'une boucle. L'interrogation est la méthode la moins efficace pour gérer les threads : la vérification répétée de l'état des diverses propriétés de thread entraîne un gaspillage des ressources.
Par exemple, vous pouvez lancer une interrogation à l'aide de la propriété IsAlive pour savoir si un thread est fermé. Utilisez cette propriété avec précaution, car un thread actif n'est pas nécessairement en cours d'exécution.
Vous pouvez obtenir de plus amples informations sur l'état d'un thread à l'aide de la propriété ThreadState de ce thread. Comme les threads peuvent être dans plusieurs états à un même moment, la valeur stockée dans ThreadState peut être une combinaison des valeurs de l'énumération System.Threading.ThreadState. Par conséquent, vous devez vérifier attentivement tous les états pertinents d'un thread lors de l'interrogation. Par exemple, si un thread n'est pas à l'état Running, cela signifie qu'il est peut-être terminé. Toutefois, il peut également être suspendu ou mis en veille.
Attente de la fin d'un thread
La méthode Thread.Join permet de déterminer si un thread a pris fin avant de démarrer une autre tâche. La méthode Join attend un laps de temps spécifié que le thread prenne fin. Si le thread prend fin dans le délai imparti, Join retourne True; sinon, il retourne la valeur False.
Comme vous pouvez l'imaginer, l'interrogation sacrifie de nombreux avantages offerts par le mode multithread au bénéfice du contrôle exercé sur l'ordre d'exécution des threads. L'interrogation est si inefficace qu'elle n'est généralement pas recommandée. Une meilleure approche consiste à utiliser la méthode Join pour contrôler les threads. Join force une procédure appelante à attendre la fin de l'exécution d'un thread ou le dépassement de délai de l'appel si un délai d'attente est précisé. Le nom de cette méthode, « Join », est basé sur l'idée que la création d'un thread représente une branche dans le chemin d'exécution. Vous utilisez Join pour fusionner des chemins d'exécution distincts en un seul thread à nouveau.
Figure 1 Modèle de thread
Important : notez que Join correspond à un appel synchrone ou bloquant. Lorsque vous appelez Join ou une méthode d'attente d'un handle d'attente, la procédure appelante s'arrête et attend que le thread signale que l'opération est terminée.
Sub JoinThreads()
Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask)
Thread1.Start()
Thread1.Join() ' Wait for the thread to finish.
MsgBox("Thread is done")
End Sub
Sub SomeTask()
' Insert code to perform a task here.
End Sub
Ces méthodes simples de contrôle des threads, qui sont utiles lorsque vous gérez un petit nombre de threads, sont difficiles à employer avec les projets importants. Techniques avancées de synchronisation aborde certaines techniques que vous pouvez utiliser pour synchroniser les threads
Voir aussi
Concepts
Multithreading avancé avec Visual Basic
Paramètres et valeurs de retour pour les procédures multithread