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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top