1. Pourquoi verrouiller et qu’est-ce qui est verrouillé ?
Lorsque nous utilisons des threads, la méthode la plus efficace est bien sûr asynchrone, c’est-à-dire que chaque thread s’exécute en même temps, sans dépendre l’un des autres ni attendre. Cependant, lorsque différents threads doivent accéder à une certaine ressource, un mécanisme de synchronisation est nécessaire, c’est-à-dire que, lors de la lecture et de l’écriture d’une même ressource, il faut faire en sorte que la ressource soit exploitée uniquement par un seul thread simultanément afin de garantir que chaque opération soit efficace et immédiate, c’est-à-dire pour garantir l’atomicité de son fonctionnement. lock est la méthode de synchronisation la plus couramment utilisée en C#, dans le format lock(objectA){codeB}.
lock(objectA){codeB} semble simple, mais il a en réalité trois significations, ce qui est essentiel pour l’utiliser correctement : 1. L’objet A est-il verrouillé ? Sinon, je le verrouille, sinon j’attends que l’objet A soit libéré. 2. Après verrouillage, les autres threads ne peuvent pas appeler codeB ni utiliser objectA lors de l’exécution de codeB. 3. Après l’exécution de codeB, release objectA, et codeB peut être accessible par d’autres threads.
2. Qu’est-il arrivé à la serrure (celle-ci) ?
Prenons un exemple :
Dans le thread t1, LockMe appelle lock(this), c’est-à-dire c1 dans la fonction principale, et lorsqu’il appelle lock(c1) dans le thread principal, il doit attendre que le bloc de verrouillage dans t1 soit exécuté avant d’accéder à c1, c’est-à-dire que toutes les opérations liées à c1 ne peuvent pas être effectuées, donc on voit que même c1. DoNotLockMe() n’est pas exécuté.
|