Avec le développement de la programmation multithread, un problème est apparu : l'accès simultané de plusieurs threads aux mêmes données. Cela entraînait des bogues imprévisibles et des corruptions d'état du programme.
Dans Visual Basic .NET, on utilise un mécanisme de verrouillage exclusif avec la construction SyncLock pour garantir qu'un seul thread peut exécuter un certain code à la fois.
La solution consiste à utiliser SyncLock (ou Monitor.Enter/Exit) autour du code d'accès aux ressources partagées, pour verrouiller l'objet pendant l'exécution de la section critique.
Exemple de code :
Private Shared Counter As Integer = 0 Private Shared ReadOnly CounterLock As New Object() Public Shared Sub IncrementCounter() SyncLock CounterLock Counter += 1 End SyncLock End Sub
Caractéristiques clés :
Peut-on utiliser un entier, une chaîne ou Nothing comme jeton de verrouillage ?
Non, SyncLock nécessite un objet de référence. Les chaînes ne sont pas recommandées, car leur internement peut entraîner une intersection implicite des verrous.
Que se passe-t-il si différents threads utilisent des objets différents pour verrouiller une même variable ?
Il n'y aura aucune synchronisation, entraînant une compétition entre les threads : il faut verrouiller strictement le même objet.
Faut-il libérer manuellement le verrou après être sorti du bloc SyncLock ?
Non, le déverrouillage se produit automatiquement lors de la sortie du bloc, même en cas d'exception.
Le code utilise des chaînes pour SyncLock, plusieurs parties du programme utilisent les mêmes littéraux de chaîne. En conséquence, des verrous différents se chevauchent et des interblocages inattendus apparaissent (deadlocks).
Avantages :
Inconvénients :
Pour chaque section critique, un objet ReadOnly séparé est déclaré. Seule la partie minime, réellement nécessaire du code est verrouillée.
Avantages :
Inconvénients :