J'ai entendu ces mots liés à la programmation concurrente, mais quelle est la différence entre eux?
Réponses
Trop de publicités?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é.
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
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 laWaitForSingleObject()
, qui est utilisé avec un mutex, vous permet de spécifier un délaiUn 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.
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.
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.