2010-10-22 7 views
5

Il s'agit principalement de la compréhension du concept, ce qui me déroute.Modèle producteur-consommateur - sémaphore binaire ou mutex?

mutex signifie qu'un fil prend le contrôle de l'accès des ressources partagées, effectue des opérations et déverrouille, alors que l'autre fil peut avoir accès pour verrouiller

tandis que sémaphore binaire est comme un fil peut avoir accès à la ressource partagée, mais l'accès à la serrure, tandis qu'un autre thread peut le déverrouiller

Dans la dernière question que j'ai vu plus here, il a été mentionné que "semaphores are more suitable for some synchronization problems like producer-consumer".

Ma question est, par exemple, si le thread producteur a gagné le verrou et remplir une file d'attente avec des données, et le consommateur en même temps le déverrouille, il n'y a pas de problème de concurrence?

Répondre

11

Je vais essayer de régler la confusion du mieux que je peux. Je vais expliquer les concepts de la façon dont ils sont traditionnellement définis. Le problème est que les gens commencent à mélanger la signification de beaucoup de ces concepts et cela crée beaucoup de confusion.

Chaque fois que nous avons un morceau de code qui modifie un peu de mémoire (disons une variable) qui est partagée entre différents processus ou threads, nous avons une section critique . Si nous ne prenons pas soin de synchroniser correctement ce morceau de code, nous aurons des bugs. Un exemple de section critique est un producteur ajoutant un élément à un conteneur partagé quelconque. Une manière de synchroniser les sections critiques est d'appliquer exclusion mutuelle. L'exclusion mutuelle signifie qu'un seul processus ou thread à la fois peut exécuter la section critique et accéder à la mémoire partagée. Notez que l'exclusion mutuelle n'est pas un mécanisme en soi, c'est un principe que nous pouvons appliquer par différents moyens. Certaines personnes parlent de verrous et de sémaphores binaires comme des mutex, mais cela mélange les concepts d'une manière qui mènera à la confusion.

Un sémaphore binaire est un moyen d'imposer une exclusion mutuelle. Chaque fois qu'un processus veut avoir accès au mutex, il peut acquérir le sémaphore. Cette opération bloquera s'il y a un autre processus qui maintient le sémaphore à ce moment. Nous avons donc une exclusion mutuelle. Une fois qu'un processus est effectué avec le mutex, nous libérons le sémaphore en laissant d'autres processus dans le mutex. De cette façon, nous pouvons réaliser une exclusion mutuelle avec un sémaphore binaire, mais ce n'est en aucun cas la seule application possible d'un sémaphore binaire.

Les sémaphores conviennent aux problèmes de production et de consommation car ils peuvent prendre un nombre naturel arbitraire, pas seulement 0 et 1 dans le cas de sémaphores binaires. Ceci est très utile lors de la synchronisation des problèmes de producteur-consommateur car vous pouvez laisser la valeur d'un sémaphore contenir le nombre d'éléments disponibles. Si le nombre d'éléments descend à zéro, les opérations du sémaphore seront automatiquement bloquées. Je comprends que l'explication du problème producteur-consommateur est un peu brève et je vous encourage à regarder des solutions utilisant des sémaphores et à comparer ces solutions à d'autres solutions qui utilisent d'autres constructions de synchronisation telles que des moniteurs ou des passages de messages. Je l'ai trouvé très éclairant.

Questions connexes