134 votes

Quelle est la différence entre un verrou exclusif et un verrou partagé ?

Selon wikipedia,

Les verrous partagés sont parfois appelés "verrous de lecture" et les verrous exclusifs sont parfois appelés "verrous d'écriture".

Pouvez-vous expliquer le raisonnement qui sous-tend les termes "partagé" et "exclusif" ?

498voto

ArjunShankar Points 8476

J'ai écrit cette réponse parce que je pensais que ce serait une analogie amusante (et appropriée) :

Pensez à un objet verrouillable comme à un tableau noir (verrouillable) dans une salle de classe contenant un enseignant (écrivain) et de nombreux étudiants (lecteurs).

Pendant qu'un enseignant écrit quelque chose (verrou exclusif) au tableau :

  1. Personne ne peut le lire, parce qu'il est encore en train d'être écrit et qu'elle vous bloque la vue => Si un objet est verrouillé de manière exclusive, les verrous partagés ne peuvent pas être obtenus. .

  2. Les autres enseignants ne se mettent pas non plus à écrire, ou bien le tableau devient illisible, ce qui perturbe les élèves. Si un objet est verrouillé de manière exclusive, d'autres verrous exclusifs ne peuvent être obtenus. .

Lorsque les élèves lisent (serrures partagées) ce qui est écrit au tableau :

  1. Ils peuvent tous lire ce qu'il y a dessus, ensemble => Plusieurs verrous partagés peuvent coexister .

  2. L'enseignante attend qu'ils aient fini de lire avant de débarrasser le tableau pour écrire d'autres =>. Si un ou plusieurs verrous partagés existent déjà, des verrous exclusifs ne peuvent être obtenus. .

41voto

Peter Wone Points 7672

C'est assez simple. Les verrous de lecture sont également connus sous le nom de verrous partagés car plusieurs processus peuvent lire en même temps. Le but d'un verrou de lecture est d'empêcher l'acquisition d'un verrou d'écriture par un autre processus. En revanche, un verrou d'écriture empêche toutes les autres opérations pendant qu'une opération d'écriture se termine, c'est pourquoi il est décrit comme exclusif.

Ainsi, un verrou de lecture dit "vous pouvez lire maintenant mais si vous voulez écrire, vous devrez attendre" alors qu'un verrou d'écriture dit "vous devrez attendre".


Je sais que vous faites des recherches pour vos études, mais je ne peux pas résister à l'envie de faire la leçon.

L'utilisation incompétente du verrouillage est l'une des principales causes des problèmes de performance. L'utilisation d'un système de verrouillage qui différencie les verrouillages en lecture et en écriture est un bon début, mais une conception soignée peut parfois éliminer une grande partie du besoin de verrouillage. Par exemple, l'état de la session doit jamais être conservés dans une collection globale par élément d'état.

Je l'ai vu faire. C'est une conception atroce, qui provoque une mise en boîte et une modification d'une collection pour chaque modification de l'état de la session, entraînant un verrouillage d'écriture prolongé. Les surcharges étaient paralysantes, réduisant effectivement le serveur à un comportement monofilaire.

Le simple fait de regrouper tous les états de session dans une structure constituait une amélioration considérable. Les modifications apportées à l'état de la session changeaient simplement les valeurs des membres de la structure d'état d'une session. Puisqu'aucune autre session n'avait l'occasion ou même la possibilité de faire directement référence à l'état d'une session, la seule collection mise à jour était la liste des sessions. Par conséquent, le verrouillage était totalement inutile. pendant par session, uniquement au début et à la fin, et le débit a été multiplié par 3000.

L'autre scénario de verrouillage courant concerne les ressources partagées entre les threads d'une application utilisateur. La plupart des cadres modernes traitent ce problème en utilisant des messages plutôt que des verrous ; lorsque vous "passez au thread de l'interface utilisateur", vous mettez en fait en file d'attente un message contenant un pointeur de fonction et certains paramètres (ou un délégué et un cadre de pile selon l'implémentation).

9voto

TOC Points 2344
  • Un verrou exclusif ou verrou d'écriture donne à un processus un accès exclusif pour écrire dans la partie spécifiée du fichier. Tant qu'un verrou d'écriture est en place, aucun autre processus ne peut verrouiller cette partie du fichier.

  • Un verrou partagé ou en lecture interdit à tout autre processus de demander un verrou en écriture sur la partie spécifiée du fichier. Cependant, d'autres processus peuvent demander des verrous en lecture.

Plus d'informations à ce sujet : http://www.gnu.org/software/libc/manual/html_node/File-Locks.html

2voto

user2155031 Points 1

Principe identique du côté de la base de données. Selon la documentation d'Oracle

Le mode de verrouillage exclusif empêche le partage de la ressource associée. Ce mode de verrouillage est obtenu pour modifier les données. La première transaction à verrouiller une ressource de manière exclusive est la seule qui peut modifier la ressource jusqu'à ce que le verrou exclusif soit libéré.

Le mode de verrouillage partagé permet de partager la ressource associée, en fonction des opérations concernées. Plusieurs utilisateurs lisant des données peuvent partager les données, en tenant des verrous de partage pour empêcher l'accès concurrent d'un écrivain (qui a besoin d'un verrou exclusif). Plusieurs transactions peuvent
acquièrent des verrous partagés sur la même ressource.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X