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?
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
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
@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. –