Quelle est la différence entre les sémaphores et les mutex fournis par la bibliothèque pthread ?
En mettant le compteur à 1 (quelle que soit la valeur que cela représente) le sémaphore devient un mutex
Quelle est la différence entre les sémaphores et les mutex fournis par la bibliothèque pthread ?
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.
En mettant le compteur à 1 (quelle que soit la valeur que cela représente) le sémaphore devient un mutex
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,
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".
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) 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.
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 !
@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
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.
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.
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'utiliserpthread_mutex_*
. (Certaines plateformes n'appliquent pas cette règle, mais c'est la norme).2 votes
@ephemient, en fait
man sem_init
dans Linux dit :Link with -pthread.
Donc je suppose que Linux ne suit pas POSIX à la lettre.