pthreads mutex vs sémaphore

Quelle est la différence entre les sémaphores et les mutex fournis par la bibliothèque pthread ?

65
demandé sur Sagar Jain 2010-01-14 19:36:54

8 réponses

Les sémaphores

ont un compteur synchronisé et les mutex sont simplement binaires (vrai / faux).

un sémaphore est souvent utilisé comme un mécanisme définitif pour répondre au nombre d'éléments d'une ressource utilisés -- par exemple, un objet qui représente n threads d'ouvrier peut utiliser un sémaphore pour compter combien de threads d'ouvrier sont disponibles.

la vérité est que vous pouvez représenter un sémaphore par un INT qui est synchronisé par un mutex.

71
répondu Hassan Syed 2010-01-14 16:43:32

je vais parler de Mutex vs binaire-sémaphore. Vous utilisez évidemment mutex pour empêcher les données d'un thread d'être accédées par un autre thread en même temps.

(supposons que vous venez d'appeler lock () et que vous êtes en train d'accéder à une donnée. Cela signifie que, vous ne vous attendez pas à ce qu'un autre thread (ou une autre instance du même thread-code) accède aux mêmes données verrouillées par le même mutex. C'est, si c'est le même thread-code obtenir exécuté sur un différentes instances de thread, frappent la serrure, alors la serrure () devrait bloquer le flux de contrôle.)

ceci s'applique à un thread qui utilise un thread-code différent, qui accède également aux mêmes données et qui est également verrouillé par le même mutex.

dans ce cas, vous êtes toujours dans le processus d'accès aux données et vous pouvez prendre, disons, 15 secondes supplémentaires pour atteindre le déverrouillage mutex (de sorte que l'autre thread qui est bloqué dans la serrure mutex se débloquerait et permettrait le contrôle d'accès aux données).

autorisez-vous jamais un autre thread à déverrouiller le même mutex, et à son tour, autorisez le thread qui attend déjà (bloquant) dans la serrure mutex à déverrouiller et accéder aux données? (J'espère que vous avez ce que je dis ici.)

selon la définition universelle convenue,

  • avec "mutex" c'est impossible. Aucun autre fil ne peut déverrouiller la serrure dans votre fil
  • avec "binaire-sémaphore" cela peut arriver. N'importe quel autre fil peut déverrouiller la serrure dans votre fil

ainsi, si vous êtes très particulier au sujet de l'utilisation du Sémaphore binaire au lieu de mutex, alors vous devriez être très prudent dans la "détermination de la portée" des serrures et des déverrouillages, je veux dire, que chaque flux de contrôle qui frappe chaque serrure devrait frapper un appel de déverrouillage et aussi là ne devrait pas être tout "premier déverrouillage", plutôt il devrait être toujours "première serrure".

17
répondu Paxi 2012-12-11 18:08:12

mutex est utilisé pour éviter la condition de course entre les fils multiples.

, alors que le sémaphore est utilisé comme élément de synchronisation utilisé dans plusieurs procédés.

mutex ne peut pas être remplacé par un sémaphore binaire car, un procédé attend le sémaphore tandis que l'autre produit Le Sémaphore. Dans le cas mutex l'acquisition et la libération sont traitées par même.

7
répondu C Learner 2012-05-18 16:26:00

la différence entre semaphore et mutex est la différence entre mécanisme et schéma . La différence réside dans leur but ( intention )et leur fonctionnement( comportemental ).

L' mutex , barrier , pipeline sont parallèle des modèles de programmation . Mutex est utilisé ( prévu ) pour protéger un critical section et assurer mutual exclusion . Barrier permet aux agents(thread/process) de s'attendre les uns aux autres.

L'une des caractéristiques ( behavior ) de mutex est que seul le(s) agent(s) autorisé(s) (processus ou fil) peut entrer dans une section critique et seul le (s) agent (s) peut en sortir volontairement.

il y a des cas où mutex permet l'utilisation d'un seul agent à la fois. Il y a cas où il autorise plusieurs agents(lecteurs multiples) et rejette certains autres agents (rédacteurs).

le semaphore est un mécanisme qui peut être utilisé ( prévu ) pour mettre en œuvre différents modèles. Il est( comportement ) généralement un drapeau (éventuellement protégé par exclusion mutuelle). (Un fait intéressant est même mutex modèle peut être utilisé pour mettre en œuvre sémaphore).

dans la culture populaire, semaphores sont des mécanismes fournis par les noyaux, et mutexes sont fournis par la bibliothèque de l'espace utilisateur.

Note, il y a des idées fausses au sujet de semaphores et mutexes . Il est dit que semaphores est utilisé pour synchronization . Et mutexes a ownership . Cela est dû à des livres OS populaires. Mais la vérité est que tous les Mutex, les sémaphores et les barrières sont utilisés pour la synchronisation . L'intention de mutex n'est pas ownership mais mutual exclusion . Cette idée fausse a donné naissance à la question d'entrevue populaire demandant la différence entre le mutexes et binary-semaphores .

résumé,

intention
  • mutex, exclusion mutuelle
  • sémaphore, à mettre en œuvre en parallèle des modèles de conception
comportement
  • mutex, seul le permis d'agent(s) entre critique l'article et uniquement cela(ils) peuvent quitter
  • sémaphore, entrez si le drapeau dit d'avancer, sinon attendre jusqu'à ce que quelqu'un change le drapeau

dans la perspective de la conception, mutex ressemble plus à state-pattern où l'algorithme qui est sélectionné par l'état peut changer l'état. Le binary-semaphore est plus comme strategy-pattern où le algorithme externe peut changer l'état et éventuellement l'algorithme / stratégie sélectionné exécuter.

3
répondu shuva 2016-05-17 18:43:38

ces deux articles expliquent de grands détails sur mutex vs sémaphores Aussi ce réponse de débordement de pile indique la réponse similaire.

2
répondu tsenapathy 2017-05-23 11:33:16

sémaphore est plus utilisé comme drapeau, pour lequel vous n'avez vraiment pas besoin D'apporter RTOS / OS. Le sémaphore peut être modifié accidentellement ou délibérément par d'autres threads (par exemple à cause d'un mauvais codage). Lorsque vous utilisez mutex, il possède les ressources. Aucun autre fil ne peut y accéder avant que la ressource ne soit gratuite.

1
répondu ajinkya 2015-09-01 02:17:38

L'Exemple Des Toilettes

Mutex:

est la clé d'une toilette. Une personne peut avoir la clé - occuper les toilettes - à l'époque. Lorsque vous avez terminé, la personne donne (libère) la clé à la personne suivante dans la file d'attente.

" les mutex sont généralement utilisés pour sérialiser l'accès à une section de code RE-entrant qui ne peut pas être exécuté simultanément par Plus d'un thread. Un objet mutex ne permet qu'un seul thread dans une section contrôlée, forcer les autres threads qui tentent d'accéder à cette section à attendre que le premier thread ait quitté cette section."

(un mutex est en fait un sémaphore de valeur 1.)

sémaphore:

est le nombre de clés de toilette identiques gratuites. Par exemple, disons que nous avons quatre toilettes avec des serrures et des clés identiques. Le compte de sémaphore - le compte de clés - est fixé à 4 Au début (les quatre toilettes sont gratuites), puis la valeur de Compte est décrémenté à mesure que les gens arrivent. Si toutes les toilettes sont pleines, c.-à-d. il n'y a plus de touches libres, le nombre de sémaphores est 0. Maintenant, quand eq. une personne quitte les toilettes, sémaphore est augmenté de 1 (un gratuit), et donné à la personne suivante dans la file d'attente.

"Un sémaphore limite le nombre d'utilisateurs simultanés d'une ressource partagée jusqu'à un nombre maximum. Les Threads peuvent demander l'accès à la ressource (décrémenter le sémaphore), et peuvent signaler qu'ils ont terminé utiliser la ressource (incrémenter le sémaphore)."

Source

1
répondu Ankur 2016-07-10 19:33:49
Les Mutex

ne peuvent être appliqués qu'à des fils dans un seul processus et ne fonctionnent pas entre les processus comme le font les sémaphores.

0
répondu batteringRam 2011-05-08 00:31:57