web-dev-qa-db-fra.com

Différences entre les variables conditionnelles, les mutex et les verrous

Par exemple les interfaces c ++ 0x

J'ai du mal à savoir quand utiliser laquelle de ces choses (cv, mutex et lock). Quelqu'un peut-il expliquer ou pointer vers une ressource?

Merci d'avance.

46
Ronny Brendel

Sur la page à laquelle vous faites référence, "mutex" est la véritable primitive de synchronisation de bas niveau. Vous pouvez prendre un mutex puis le libérer, et un seul thread peut le prendre à la fois (il s'agit donc d'une primitive de synchronisation). Un mutex récursif est un mutex qui peut être pris par le thread même plusieurs fois, puis il doit être libéré autant de fois par le même thread avant que d'autres puissent le prendre.

Un "verrou" ici est juste une classe wrapper C++ qui prend un mutex dans son constructeur et le libère au niveau du destructeur. Il est utile pour établir la synchronisation pour les étendues C++.

Une variable de condition est une forme de primitive de synchronisation plus avancée/de haut niveau qui combine un verrou avec un mécanisme de "signalisation". Il est utilisé lorsque les threads doivent attendre qu'une ressource soit disponible. Un thread peut "attendre" un CV, puis le producteur de ressources peut "signaler" la variable, auquel cas les threads qui attendent le CV sont notifiés et peuvent continuer leur exécution. Un mutex est combiné avec CV pour éviter la condition de concurrence critique où un thread commence à attendre un CV en même temps qu'un autre thread veut le signaler; il n'est alors pas contrôlable que le signal soit délivré ou perdu.

68
Antti Huima

Je ne suis pas trop familier avec C++ 0x, alors prenez cette réponse avec un grain de sel.

re: Mutex vs verrous: D'après la documentation que vous avez publiée, il semble qu'un mutex est un objet représentant un mutex du système d'exploitation, tandis qu'un lock est un objet qui contient un mutex pour faciliter le - modèle RAII .

Les variables de condition sont un mécanisme pratique pour associer un mécanisme de blocage/signalisation (signal + attente) à un mécanisme d'exclusion mutuelle, tout en les conservant découplées dans le système d'exploitation afin que vous, en tant que programmeur système, puissiez choisir l'association entre condvar et mutex. (utile pour traiter plusieurs ensembles d'objets accessibles simultanément) Rob Krten a quelques bonnes explications sur les condvars dans l'un des chapitres en ligne de son livre sur QNX .

En ce qui concerne les références générales: Ce livre (pas encore sorti) semble intéressant.

5
Jason S