643 votes

Lock, mutex, sémaphore ... quelle est la différence?

J'ai entendu ces mots liés à la programmation concurrente, mais quelle est la différence entre eux?

790voto

Peter Points 9636

Un verrou n'autorise qu'un seul thread à entrer dans la partie verrouillée et le verrou n'est partagé avec aucun autre processus.

Un mutex est identique à un verrou, mais il peut être étendu à tout le système.

Un sémaphore fait la même chose qu'un mutex mais permet à x nombre de threads d'entrer.

Vous avez également des verrous en lecture / écriture qui permettent un nombre illimité de lecteurs ou un écrivain à un moment donné.

154voto

fante Points 36

Il y a beaucoup d'idées fausses au sujet de ces mots.

C'est à partir d'un post précédent (http://stackoverflow.com/a/24582076/3163691) qui s'adapte superbe ici:

1) Section Critique= objet de Noyau utilisé pour permettre l'exécution de juste un thread actif de beaucoup d'autres au sein d'un processus. Les autres threads sélectionnés sont mis à dormir.

[Sans interprocessus capacité, très primitive de l'objet].

2) Mutex, Sémaphore (aka Mutex)= Noyau de l'objet utilisé pour permettre l'exécution de juste un thread actif de beaucoup d'autres, entre les différents processus. Les autres threads sélectionnés sont mis à dormir. Cet objet prend en charge thread à la propriété, le fil notification de résiliation, la récursivité (plusieurs 'acquérir' des appels de même thread) et "inversion de priorité évitement".

[Interprocessus capacité, très sûr à utiliser, une sorte de "haut niveau" de la synchronisation de l'objet].

3) Comptage Sémaphore (aka Sémaphore)= Noyau de l'objet utilisé pour permettre l'exécution d' un groupe de threads actifs de beaucoup d'autres. Les autres threads sélectionnés sont mis à dormir.

[Interprocessus capacité cependant pas très sûr à utiliser car il manque suivantes mutex attributs: fil notification de résiliation, la récursivité?, 'inversion de priorité évitement"?, etc].

4) Et maintenant, à parler de "spinlocks", d'abord quelques définitions:

La Région critique= Une région de mémoire partagée en 2 ou plusieurs processus.

Lock= Une variable dont la valeur permet ou interdit l'entrée à une "critique de la région".

Occupé attente= Continuellement test d'une variable jusqu'à une certaine valeur s'affiche.

Enfin:

Spin-lock (aka Spinlock)= Une serrure qui utilise occupé attente. (L'acquisition de la serrure est faite par xchg ou similaire opérations atomiques).

[Sans fil de couchage, utilisé surtout au niveau du noyau. Ineffcient pour le niveau de l'Utilisateur code].

Un dernier commentaire, je ne suis pas sûr, mais je suis prêt à parier beaucoup d'argent que les 3 premiers synchronisation d'objets (#1, #2 et #3) utiliser ce simple bête (#4) dans le cadre de leur mise en œuvre.

Une bonne journée!.

Références:

-En Temps réel des Concepts pour les Systèmes Embarqués par les Qing Li avec Caroline Yao (CMP Livres).

Aussi, vous pouvez prendre un coup d'oeil à regarder: http://stackoverflow.com/a/24586803/3163691

27voto

onmyway133 Points 2196

Jetez un oeil à Multithreading Tutoriel par Jean-Kopplin.

Dans la section de Synchronisation Entre les Threads, il explique la différence entre événement, de le verrouiller un mutex, sémaphore, waitable minuterie

Un mutex peut être détenue par un seul thread à la fois, permettant à des threads coordonner mutuellement un accès exclusif à une ressource partagée

Section critique les objets fournir la synchronisation similaire à celle fournis par mutex objets, sauf que les objets section critique peut être utilisé uniquement par les threads d'un même processus

Une autre différence entre un mutex et une section critique est que si la critique de l'objet de la section est actuellement détenue par un autre thread, EnterCriticalSection() attend indéfiniment propriété tandis que la WaitForSingleObject(), qui est utilisé avec un mutex, vous permet de spécifier un délai

Un sémaphore maintient un nombre entre zéro et un maximum de valeur, limiter le nombre de threads qui sont à la fois l'accès à un ressource partagée.

12voto

andy boot Points 3270

Wikipédia a un grand article sur les différences entre les Sémaphores et les Mutex

(copier coller ci-dessous:)\

Un mutex est essentiellement la même chose qu'un sémaphore binaire et parfois utilise la même base de mise en œuvre. Les différences entre les eux sont les suivants:

Mutex ont un concept d'un propriétaire, qui est le processus qui a verrouillé le mutex. Seul le processus qui a verrouillé le mutex peut le déverrouiller. En revanche, un sémaphore n'a pas de notion de propriétaire. Tout le processus peut déverrouiller un sémaphore.

À la différence des sémaphores, mutex fournir inversion de priorité à la sécurité. Depuis le mutex connaît son propriétaire actuel, il est possible de promouvoir la priorité du propriétaire toutes les fois qu'un de priorité plus élevée tâche démarre en attente du mutex.

Mutex également fournir la suppression de la sécurité, où le processus qui détient le mutex ne peut pas être accidentellement supprimé. Les sémaphores ne fournissent pas cette.

5voto

Bruce Penswick Points 79

Ma compréhension est qu'un mutex est uniquement pour une utilisation au sein d'un seul processus, mais à travers ses nombreux fils, alors qu'un sémaphore peut être utilisé dans de multiples processus, et à travers leurs séries de fils.

Aussi, un mutex est binaire (c'est soit verrouillé ou non), alors qu'un sémaphore a une notion de comptage, ou une file d'attente de plus d'un verrouillage et déverrouillage des demandes.

Quelqu'un pourrait-il vérifier mon explication? Je parle dans le contexte de Linux, plus précisément de Red Hat Enterprise Linux (RHEL) de la version 6, qui utilise un noyau 2.6.32.

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