Deadlock Errore nella reciprocamente Concurrent Go routine
-
27-10-2019 - |
Domanda
Ho tre routine go concomitanti come qui di seguito,
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()
}
Questo codice logica dà situazione di stallo ogni volta. In realtà, quando viene eseguito, basta eseguire istruzione di stampa di routine di 1 (dichiarazione tra i segni *) manytimes (anche se la mia affermazione di stampa è solo uno) e dà l'errore stallo. Qualcuno mi può informare ciò che è sbagliato con la logica del codice. Grazie.
NB. Per ulteriori informazioni, il codice può essere trovato qui, http://play.golang.org/p/pW6aXryUaK, in cui solo numero di linea 290 è in esecuzione. Il codice originale che contiene nessun errore, può essere trovato qui play.golang.org/p/UL3rj8DJRk. Mi Basta aggiungere bloccare e sbloccare a loro. Grazie.
Voglio aggiungere un altro punto: nel codice di play.golang.org/p/UL3rj8DJRk, si possono trovare le uscite di varie dichiarazioni di stampa come questo: processo [numero] manda [int] al processo [numero ] a [secondi tempo nano]. Tuttavia, come il risultato di tre routine simultanei, a volte l'istruzione di stampa non è in esecuzione correttamente (mezzo che non sia la stampa di tutto, c'è qualche cosa che sono stati inseriti da un'altra stampa come processo [numero] manda [int] al processo [numero] al processo [numero ]). Può un aiuto corpo mi come gestire questo?
Soluzione
E 'impossibile identificare la causa della situazione di stallo perché il codice che hai postato non contiene abbastanza informazioni.
Può essere causato da l'ordine in cui si sta acquistando le serrature, o può essere causato da un utilizzo di canali Go unbuffered.
Fino a quando si registra il codice sorgente completo Go, non v'è alcun modo per rispondere alla tua domanda.
Se avete bisogno di discutere il codice nella maggior lunghezza, probabilmente dovrebbe inviare a golang-dadi .