Simple Blocage Des Exemples
Je voudrais expliquer le filetage des blocages pour les débutants. J'ai vu de nombreux exemples de blocages dans le passé, certains à l'aide de code et à l'aide d'illustrations (comme le fameux 4 voitures). Il y a aussi des classiques facilement-dans l'impasse des problèmes comme La Salle À Manger Philosophes, mais il peut être trop complexe pour un vrai débutant à saisir pleinement.
Je suis à la recherche pour le code le plus simple pour illustrer ce que les blocages sont. L'exemple doit:
- Se rapportent à une "vraie" programmation scénario qui est un peu logique
- Être très courte, simple et
Que recommandez-vous?
- pourquoi ne pas utiliser le fameux 4 voitures, comme il semble assez simple pour moi.
- Les 4 voitures ne sont pas une programmation de scénario, et il n'est pas trivial pour un débutant à l'abstrait un problème de la forme de 4 voitures. Je ne les utiliser, mais vous souhaitez montrer une programmation scénario où le blocage se produire.
Vous devez vous connecter pour publier un commentaire.
Peut-être une simple situation de la banque.
Évidemment, devrait-il y avoir deux fils qui tentent de transfert(a, b) et de transfert(b, un) en même temps, puis un blocage va se produire parce qu'ils essaient d'obtenir les ressources dans l'ordre inverse.
Ce code est également idéal pour chercher des solutions à l'impasse ainsi. Espérons que cette aide!
Account
est comparable, alors il sera quelque chose comme:sync(std::max(from, to)); sync(std::min(from, to));
. Et bien sûr, vous devez vérifier quefrom != to
.sync(Account & a) { a.mutex.lock(); }
.Laisser la nature à expliquer l'impasse,
Blocage: la Grenouille vs Serpent
Voici un exemple de code à partir de le département d'informatique de l'université de Taiwan montrant un simple exemple java avec verrouillage de ressource. C'est très "vraie vie" pertinente pour moi. Le Code ci-dessous:
Si method1() et method2() à la fois sera appelé par deux ou plusieurs threads, il ya une bonne chance de blocage car si le thread 1 acquiert un verrou sur l'objet de type String lors de l'exécution de method1() et le fil 2 acquiert un verrou sur l'objet Integer lors de l'exécution de method2 (), les deux seront en attente pour chaque autre la libération de verrouillage sur les Integer et String pour aller plus loin, ce qui ne se produira jamais.
Un simple exemple de blocage que j'ai rencontré.
private int index
en train de faire là?Voici un exemple simple en C++11.
Veuillez voir ma réponse à cette question. Bas de ligne à chaque fois que deux threads ont besoin d'acquérir des deux ressources différentes, et de le faire dans des ordres différents, alors vous pouvez obtenir les blocages.
Un exemple est, je pense, la Table, Lampe de poche, des Piles et de scénario. Imaginez une lampe de poche et une paire de batteries placées sur le dessus de la table. Si vous marchez à cette table et de saisir les piles alors que l'autre personne a la lampe de poche, vous deux sera forcé de maladroitement regardent les uns les autres en attendant qui aura la première place de leur point de revenir sur la table. Ceci est un exemple de blocage. Vous et la personne sont en attente de ressources, mais aucun de vous donner de leurs ressources.
De même, dans un programme, un blocage se produit lorsque deux ou plusieurs threads (vous et l'autre personne) sont en attente pour deux ou plus de deux serrures (lampe de poche et piles) à être libéré et les circonstances dans le programme sont telles que les verrous ne sont jamais libérés (vous avez tous les deux une pièce du puzzle).
Si vous connaissez java, c'est comment vous pouvez représenter ce problème:
Si vous exécutez cet exemple, vous remarquerez que parfois les choses de travail agréable et correctement. Mais parfois, votre programme sera tout simplement pas imprimer quoi que ce soit. C'est parce que une personne a les piles alors que l'autre personne a la lampe de poche qui empêche d'allumer la lampe de poche provoquant un blocage.
Cet exemple est similaire à l'exemple donné par le java tutoriels: http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html
Un autre exemple est la boucle exemple:
Cet exemple pouvez soit l'imprimer, de "ne Pas faire" plus et plus, ou il ne peut jamais l'impression de "ne Pas faire" à tous. La première se produit parce que le premier thread acquiert la classe de verrouillage et de ne jamais libère la prévention des "stopLoop' accès par le deuxième thread. Et la dernière se produit parce que le deuxième thread a commencé avant le premier thread origine du 'fait' variable pour être vrai avant le premier thread s'exécute.
Je considère la salle à Manger problème de Philosophes pour être l'un des plus simple des exemples en montrant les blocages, mais, depuis le 4 impasse des exigences peut être facilement illustré par le dessin (en particulier la circulaire d'attente).
Je considère des exemples du monde réel pour être beaucoup plus déroutant pour le débutant, mais je ne peux pas penser à un bon scénario réel sur le dessus de ma tête (je suis relativement inexpérimenté dans le monde réel de la simultanéité).
J'ai récemment réalisé que les combats entre les couples ne sont rien, mais un blocage.. où généralement un processus a une panne à résoudre, bien sûr, c'est la moindre priorité un(Garçon ;)).
Ici l'analogie...
De Fabrication1: Fille(G) Process2: Garçon(B)
Resource1: Désolé Resource2: l'Acceptation d'erreur
Conditions Nécessaires:
1. Exclusion mutuelle: un Seul de G ou B peut s'excuser ou d'accepter Erreur à la fois.
2. Tenir et Attendre: À un moment, on est tenue Désolé et autres Acceptant erreur, on est en attente pour l'Acceptation d'une erreur pour la libération désolé, et l'autre est en attente pour l'désolé pour la libération d'accepter erreur.
3. Pas de droit de préemption: Pas même Dieu ne peut forcer B ou G pour libérer Désolé ou d'Accepter de la propre faute. Et volontairement? Vous vous moquez de moi??
4. Circulaire Attendre: Encore une fois, l'un tenant désolé attend les autres à accepter propres erreurs, et une tenue accepter propres erreurs voulez dire désolé en premier. Il est donc circulaire.
Donc des blocages se produisent lorsque toutes ces conditions sont en effet au même moment, et c'est toujours le cas dans un couple lutte 😉
Source: http://www.quora.com/Saurabh-Pandey-3/Posts/Never-ending-couple-fights-a-deadlock
Un plus simple exemple de blocage avec deux ressources différentes et deux fil d'attente pour chaque autre la libération des ressources. Directement à partir de examples.oreilly.com/jenut/Deadlock.java
If all goes as planned, deadlock will occur, and the program will never exit.
Pouvons-nous faire de cet exempleguarantee
impasse ?La producteurs-consommateurs de problème avec coin repas philosophes problème est probablement aussi simple que cela va devenir. Il a une certaine pseudo-code qui illustre à elle, ainsi. Si ceux-ci sont trop complexes pour un débutant il vaut mieux qu'ils essaient plus difficile d'en saisir le sens.
Aller pour le simplist possible scénario dans lequel blocage peut se produire lorsque introduire le concept de vos élèves. Cela implique un minimum de deux fils et d'un minimum de deux ressources (je pense). L'objectif étant de concevoir un scénario dans lequel le premier thread a un verrou sur une ressource, et est en attente du verrou sur la ressource en deux pour être libéré, alors que dans le même temps, enfiler deux détient un verrou sur la ressource en deux, et est en attente d'un verrou sur une ressource pour être libéré.
Il n'importe pas vraiment ce que les ressources sous-jacentes sont; pour simplicities souci, vous pouvez juste faire une paire de fichiers que les deux fils sont en mesure d'écrire.
EDIT: Ceci n'assume aucune communication inter-processus autres que les verrous détenus.
J'ai trouvé cela un peu difficile à comprendre à la lecture de la salle à manger des philosophes problème, blocage à mon humble avis est en fait liée à l'allocation des ressources.
Aimerais partager plus simple exemple où 2 Infirmière besoin de se battre pour 3 de l'équipement pour effectuer une tâche.
Même si il est écrit en java. Une simple méthode lock() est créé pour simuler la façon dont le blocage se produire, de sorte qu'il peut s'appliquer dans d'autres langage de programmation ainsi.
http://www.justexample.com/wp/example-of-deadlock/
Exemple Simple de https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html
De sortie:
Thread Dump:
Voici un simple blocage en Java. Nous avons besoin de deux ressources pour la démonstration de l'impasse. Dans l'exemple ci-dessous, une ressource est la classe de verrouillage(via la méthode de synchronisation) et l'autre est un entier 'i'
Blocage peut se produire dans une situation où un
Girl1
est vouloir flirter avecGuy2
, qui est pris par un autreGirl2
, etGirl2
est vouloir flirter avec unGuy1
qui est interceptée parGirl1
. Depuis, les deux filles sont en attente pour décharger les uns des autres, la condition est appelée impasse.no locks == orgy
? )Ici est un simple blocage en C#.
Si, un jour, vous appelez cela à partir de l'interface graphique du fil, et un autre thread appelle ainsi - que vous pourriez impasse. L'autre fil est à EndInvoke, attend que le thread GUI pour exécuter le
délégué tout en maintenant le verrou. Le thread GUI blocs sur le même verrou en attente pour l'autre thread de presse - qu'elle ne sera pas parce que le thread GUI ne sera jamais disponible pour exécuter le délégué de l'autre thread est en attente pour les. (bien sûr, le verrouillage n'est pas strictement nécessaire, il n'est peut-être le EndInvoke, mais en un peu plus de scénario complexe, un verrou pourrait être acquis par l'appelant pour d'autres raisons, résultant dans la même impasse.)
J'ai créé un ultra Simple Exemple de Blocage:-
Dans l'exemple ci-dessus 2 threads s'exécutent les méthodes synchronisées de deux objets différents.
Synchronisé methodA est appelée par l'objet threadDeadLockA et synchronisé methodB est appelée par l'objet threadDeadLockB. Dans methodA une référence de threadDeadLockB est passé et dans methodB une référence de threadDeadLockA est passé. Maintenant, chaque thread tente d'obtenir un verrou sur un autre objet. Dans methodA le fil qui est un verrou sur threadDeadLockA est d'essayer d'obtenir un verrou sur l'objet threadDeadLockB et de même dans methodB le fil qui est un verrou sur threadDeadLockB est d'essayer d'obtenir un verrou sur threadDeadLockA. Donc à la fois le fils attendra toujours la création d'un blocage.
Laissez-moi vous expliquer plus clairement à l'aide d'un exemple avoir plus de 2 threads.
Disons que vous avez n fils de chaque exploitation verrous L1, L2, ..., Ln, respectivement. Maintenant, disons, à partir de fil de 1, chaque thread tente d'acquérir son voisin du fil de verrouillage. Donc, le thread 1 est bloquée pour la tentative d'acquisition de la L2 (L2 est détenue par le thread 2), le thread 2 est bloquée pour les L3 et ainsi de suite. Le fil n est bloquée pour la L1. C'est maintenant un blocage qu'aucun thread n'est en mesure d'exécuter.
Dans l'exemple ci-dessus, vous pouvez voir qu'il y a trois fils holding
Runnable
s task1, task2, et task3. Avant de faire la déclarationsleep(100)
les fils acquérir les trois objets de travail des serrures " quand ils entrent dans lecall()
méthode (en raison de la présence desynchronized
). Mais dès qu'ils essaient decallAnother()
sur leur prochain thread de l'objet, ils sont bloqués, conduisant à un blocage, parce que ces objets serrures " ont déjà été prises.Une façon détournée de blocage avec un seul thread est d'essayer de verrouiller le même (non récursif) mutex deux fois. Cela pourrait ne pas être l'exemple simple que vous cherchiez, mais bien sûr j'ai rencontré ce genre de cas déjà.