81 votes

pthreads mutex vs sémaphore

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

11 votes

Les sémaphores ne sont pas fournis par pthreads, et peuvent être utilisés dans des programmes non-threadés également.

5 votes

Toute construction de synchronisation peut être utilisée dans du code non threadé :P

4 votes

Eh bien, la différence que je voulais souligner est que les sémaphores étaient utilisés avant les pthreads. Vous pouvez placer un sem_t dans la mémoire partagée et l'utiliser pour synchroniser les opérations entre les processus. D'autre part, même si vous ne créez pas de threads multiples, vous devez compiler & lier avec -pthread afin d'utiliser pthread_mutex_* . (Certaines plateformes n'appliquent pas cette règle, mais c'est la norme).

84voto

Hassan Syed Points 10746

Les sémaphores ont un compteur synchronisé et les mutex sont juste binaires (vrai / faux).

Un sémaphore est souvent utilisé comme mécanisme définitif pour répondre au nombre d'éléments d'une ressource en cours d'utilisation -- par exemple, un objet qui représente n fils de travail peut utiliser un sémaphore pour compter le nombre de fils de travail disponibles.

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

3 votes

En mettant le compteur à 1 (quelle que soit la valeur que cela représente) le sémaphore devient un mutex

1 votes

Cela signifie-t-il que le mutex et les sémaphores binaires sont une seule et même chose ?

19voto

Paxi Points 81

Je vais parler de Mutex et de Semaphore binaire. Vous utilisez évidemment le mutex pour empêcher les données d'un thread d'être accédées par un autre thread au même moment.

(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. En d'autres termes, si c'est le même thread-code exécuté sur une autre instance de thread, qui frappe le verrou, alors le lock() devrait bloquer le flux de contrôle).

Cela s'applique à un thread qui utilise un code thread 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 en train d'accéder aux données et vous pouvez prendre, disons, 15 secondes de plus pour atteindre le déverrouillage du mutex (afin que l'autre thread qui est bloqué dans le verrouillage du mutex se débloque et permette au contrôle d'accéder aux données).

Est-ce qu'il vous arrive de permettre à un autre thread de déverrouiller le même mutex et de permettre ainsi au thread qui attend déjà (bloque) le verrouillage du mutex de se débloquer et d'accéder aux données ? (J'espère que vous avez compris ce que je veux dire ici).

Selon la définition universelle convenue,

  • avec "mutex" cela ne peut pas arriver. Aucun autre thread ne peut déverrouiller le verrou dans votre thread
  • avec "binary-semaphore" cela peut arriver. N'importe quel autre thread peut déverrouiller le verrou de votre thread

Donc, si vous êtes très particulier sur l'utilisation de sémaphore binaire au lieu de mutex, alors vous devriez être très prudent dans le "scoping" des verrous et déverrous, je veux dire, que chaque flux de contrôle qui frappe chaque verrou devrait frapper un appel de déverrouillage et aussi il ne devrait pas y avoir de "premier déverrouillage", plutôt il devrait toujours être "premier verrou".

0 votes

J'aime le scoping partie. Il s'agit de la partie de la mise en œuvre qui diffère dans le sémaphore binaire et le mutex.

7voto

C Learner Points 331

Le mutex est utilisé pour éviter les conditions de course entre plusieurs threads.

alors que le sémaphore est utilisé comme élément de synchronisation entre plusieurs processus.

mutex ne peut pas être remplacé par un sémaphore binaire car un processus attend le sémaphore tandis que l'autre processus le libère. Dans le cas du mutex, l'acquisition et la libération sont gérées par le même processus.

1 votes

(-1) Généralisation incorrecte : d'une part, les mutex peuvent être partagés entre les processus -- par exemple : msdn.microsoft.com/fr/us/library/ms682411(VS.85).aspx . Si votre système ne dispose pas de mutex nommés, mappez simplement de la mémoire partagée et créez les vôtres.

1 votes

Il n'est pas juste de le qualifier de "non utile". J'ai travaillé sur M$ assez souvent. Il est facile de dire à quelqu'un d'utiliser la mémoire partagée. Sur M$, tous les objets du noyau sont nommés et partagés. Mutex est un objet du noyau. Un mutex de pthread est une CRITICAL_SECTION chez M$. Il n'y a aucun moyen de partager une CRITICAL_SECTION entre processus !

0 votes

@hackworks - pthread_mutex peut être initialisé avec le drapeau "_POSIX_THREAD_PROCESS_SHARED" qui lui permet de travailler dans un environnement interprocessus : linux.die.net/man/3/pthread_mutexattr_init

3voto

sena Points 444

Ces deux articles expliquent en détail mutex vs sémaphores Aussi ce La réponse à la question du débordement de pile est similaire.

-1voto

batteringRam Points 47

Les mutex ne peuvent être appliqués qu'aux threads d'un seul processus et ne fonctionnent pas entre les processus comme les sémaphores.

0 votes

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