2011-12-02 2 views
0

J'ai trois routines de go simultanées comme ci-dessous,Deadlock Erreur dans Mutually simultanées Go Routines

func Routine1() { 
    mutex1.Lock() 

    do something 

    mutex2.Lock() 
    mutex3.Lock() 
    send int to routine 2 
    send int to routine 3 
    * Print Something * 
    mutex2.Unlock() 
    mutex3.Unlock() 

    receive ints 
    do something 

    mutex2.Lock() 
    mutex3.Lock() 
    send int to routine 2 
    send int to routine 3 
    Print Something 
    mutex2.Unlock() 
    mutex3.Unlock() 

    do something 
    receive ints 
    mutex1.Unlock() 
    wg.Done() 
} 

func Routine2() { 
    mutex2.Lock() 

    do something 

    mutex1.Lock() 
    mutex3.Lock() 
    send int to routine 1 
    send int to routine 3 
    Print Something 
    mutex1.Unlock() 
    mutex3.Unlock() 

    do something 
    receive ints 

    mutex1.Lock() 
    mutex3.Lock() 
    send int to routine 1 
    send int to routine 3 
    Print Something 
    mutex1.Unlock() 
    mutex3.Unlock() 

    do something 
    receive ints 
    mutex2.Unlock() 
    wg.Done() 
} 

func Routine3() { 
// same structure as routine 1 & 2 
} 
func main() { 
wg.Add(3) 
go Routine1() 
go Routine2() 
Routine3() 
wg.Wait() 
} 

Ce code logique donne la situation impasse chaque fois. En fait, quand il s'exécute, exécutez simplement l'instruction print de la routine 1 (instruction entre * marks) plusieurs fois (bien que mon instruction d'impression n'en soit qu'une) et donne une erreur de blocage. Quelqu'un peut-il me dire ce qui ne va pas avec la logique du code? Merci.

NB. Pour plus d'informations, le code peut être trouvé ici, http://play.golang.org/p/pW6aXryUaK, où seul le numéro de ligne 290 est en cours d'exécution. Le code original qui ne contient aucune erreur, peut être trouvé ici play.golang.org/p/UL3rj8DJRk. Je viens d'ajouter un verrou et de déverrouiller pour eux. Merci.

Je veux ajouter un autre point: dans le code de play.golang.org/p/UL3rj8DJRk, vous pouvez trouver des sorties de diverses déclarations d'impression comme ceci: processus [nombre] envoie [int] pour traiter [nombre] à [temps nano secondes]. Cependant, à la suite de trois routines simultanées, parfois l'instruction print ne s'exécute pas correctement (signifie pas impression entière, il y a quelque chose inséré par une autre print comme processus [nombre] envoie [int] pour traiter [nombre] au processus [nombre ]). Quelqu'un peut-il m'aider à gérer cela?

Répondre

1

Il est impossible d'identifier la cause de l'interblocage car le code que vous avez publié ne contient pas suffisamment d'informations.

Cela peut être dû à l'ordre d'acquisition des verrous ou à l'utilisation des canaux Go non tamponnés.

Jusqu'à ce que vous publiez le code source Go complet, il n'y a aucun moyen de répondre à votre question.

Si vous devez discuter du code en plus grande longueur, vous devriez probablement l'envoyer à golang-nuts.

+0

Le code complet, vous pouvez trouver sur http://play.golang.org/p/pW6aXryUaK, où seul le numéro de ligne 290 est en cours d'exécution. Merci. – Arpssss

+0

Un ajout supplémentaire, le code original qui ne contient aucune erreur, peut être trouvé ici http://play.golang.org/p/UL3rj8DJRk. Je viens d'ajouter un verrou et de déverrouiller pour eux. – Arpssss

+1

@Arpssss: Votre code n'est pas idiomatique code Go. C'est le bordel. Vous utilisez des verrous et des canaux tamponnés sans raison. Postez votre code (http://play.golang.org/p/pW6aXryUaK) sur http://groups.google.com/group/golang-nuts - espérons que les gens de golang-nuts vous aideront à améliorer le code. –