Mutex lock: ce n' “blocage”?
J'ai lu sur le multithreading et de ressources partagées, l'accès et l'un des nombreux (pour moi) de nouveaux concepts est le mutex lock. Ce que je n'arrive pas à trouver est ce qui se passe réellement sur le fil qui trouve une "section critique" est verrouillé. Il est dit dans de nombreux endroits que plus le fil est "bloqué", mais ça veut dire quoi? Est-il suspendu, et il va le reprendre lorsque le verrouillage est annulé? Ou d'essayer de nouveau dans la prochaine itération de la "boucle"?
La raison pour laquelle je demande, c'est parce que je veux avoir un système fourni des événements (souris, clavier, etc.), qui (apparemment) sont livrés sur le thread principal, pour être traitées dans un très spécifique dans le cadre de l'exécution de la boucle de mon thread secondaire. Donc, quel que soit l'événement est livré, je file dans ma propre discbased. De toute évidence, la discbased besoin d'un mutex lock parce que c'est d'être modifiés par les deux threads. Le manque de puzzle-pièce est la suivante: qu'advient-il lorsqu'un événement est livré dans une fonction sur le thread principal, je veux de la file d'attente, mais la file d'attente est-il verrouillé? Sera le thread principal d'être suspendu, ou est-ce juste sauter le verrou et hors de portée (perte de l'événement)?
OriginalL'auteur zmippie | 2010-10-20
Vous devez vous connecter pour publier un commentaire.
Bloqué moyens d'exécution reste coincé; en général, le fil est mis en sommeil par le système et les rendements du processeur à un autre thread. Lorsqu'un thread est bloqué en essayant d'acquérir un mutex, l'exécution reprend lorsque le mutex est libéré, bien que le thread peut bloquer de nouveau si un autre thread attrape le mutex avant.
Il y a généralement un essayez-le fonctionnement de la serrure qui saisissent le mutex si possible, et sinon, une erreur est renvoyée. Mais vous êtes finalement allez avoir à déplacer l'événement en cours dans la file d'attente. Aussi, si vous avez du retard de déplacer les événements dans le thread où ils sont traités, l'application ne répond pas, peu importe.
Une file d'attente est en fait un cas où on peut s'en sortir sans l'aide d'un mutex. Par exemple, Mac OS X (et, éventuellement, iOS) fournit la
OSAtomicEnqueue()
etOSAtomicDequeue()
fonctions (voirman atomic
ou<libkern/OSAtomic.h>
) qui exploitent spécifiques au processeur opérations atomiques afin d'éviter à l'aide d'un verrou.Mais, pourquoi ne pas simplement traiter les événements sur le thread principal dans le cadre de la course principale de la boucle?
OriginalL'auteur Jeremy W. Sherman
La façon la plus simple de penser, c'est que le thread bloqué est mis en attente ("sommeil") de l'état jusqu'à ce que le mutex est publié par le thread qui le tient. À ce stade, le système d'exploitation va "réveiller" l'un des threads en attente sur le mutex et laisser l'acquérir et de continuer. C'est comme si le système d'exploitation met tout simplement le thread bloqué sur une étagère jusqu'à ce qu'il dispose de la chose dont elle a besoin pour continuer. Jusqu'à ce que le système d'exploitation reprend le fil de l'étagère, c'est ne rien faire. Le exacte de mise en œuvre -- thread qui arrive à passer à côté, si ils sont tous réveillés ou ils sont mis en file d'attente-dépendra de votre système d'exploitation et quel langage/framework que vous utilisez.
OriginalL'auteur tvanfosson
Trop tard pour répondre, mais je peut faciliter la compréhension. Je parle plus de perspective de mise en œuvre plutôt que de textes théoriques.
Le mot "blocage" est une sorte de technique homonyme. Les gens peuvent l'utiliser pour de couchage ou de simples attente. Le terme doit être compris dans le contexte de l'utilisation.
Moyens de blocage en Attente - Assumer sur un système SMP un thread B veut acquérir un spinlock détenus par un autre thread A. l'Un des mécanismes est de désactiver la préemption et continuent de tourner sur le processeur, sauf si B se fait. Un autre mécanisme probablement, une efficace, est de permettre à d'autres threads à utiliser le processeur, dans le cas B ne l'obtient en facile tentatives. Par conséquent, nous planifier fil B (comme la préemption est activé) et donner processeur à un autre thread C. Dans ce cas, le thread B attend simplement dans le planificateur de tâches de la file d'attente et revient à son tour. Comprendre que B n'est pas dormir juste en attente plutôt passivement au lieu de occupé-attendre, et la combustion de cycles de processeur. Sur BSD et Solaris, les systèmes de données, des structures comme tourniquets pour mettre en œuvre cette situation.
Le blocage des moyens de Couchage - Si le thread B a plutôt fait appel système comme read() attente des données à partir d'une prise réseau, il ne peut pas se poursuivre jusqu'à ce qu'il obtient. Par conséquent, certains textes désinvolture utiliser le terme de blocage que "... bloqué pour les I/O" ou "... dans le système de blocage d'appels". En fait, le fil B est plutôt de couchage. Il y a des données de structures connu sous files d'attente l'instar de luxe, les salles d'attente de l'air-ports :-). Le fil sera réveillé lors de l'OS détecte la disponibilité des données, à l'instar d'une surveillance de la salle d'attente.
OriginalL'auteur ultimate cause
Blocage signifie simplement que. Il est bloqué. Il ne pourra pas se poursuivre jusqu'à ce pouvoir. Vous ne dites pas la langue que vous utilisez, mais la plupart des langues/les bibliothèques ont verrouiller des objets où vous pouvez "essayer" de prendre la serrure, puis continuer et faire quelque chose de différent en fonction de si vous avez réussi ou pas.
Mais, par exemple, Java synchronisé blocs, votre fil restera bloqué jusqu'à ce qu'il est en mesure d'acquérir le moniteur (mutex lock). Le
java.util.concurrent.locks.Lock
interface décrit verrouiller des objets qui ont plus de flexibilité en termes de verrouillage d'acquisition.OriginalL'auteur dty