Pregunta

Tengo tres rutinas go concurrentes, como a continuación:

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()
}

Este código da lógica situación de bloqueo cada vez. En realidad, cuando se ejecuta, sólo hay que ejecutar sentencia de impresión de rutina 1 (estado entre las marcas *) manytimes (aunque mi declaración de impresión es sólo uno) y da error de punto muerto. Alguien me puede informar lo que está mal en la lógica del código. Gracias.

NB. Para obtener más información, el código se puede encontrar aquí, http://play.golang.org/p/pW6aXryUaK, donde sólo el número de línea 290 está ejecutando. El código original que no contiene ningún error, se puede encontrar aquí play.golang.org/p/UL3rj8DJRk. Puedo añadir bloquear y desbloquear a ellos. Gracias.

Quiero añadir otro punto: en el código de play.golang.org/p/UL3rj8DJRk, se pueden encontrar las salidas de varias sentencias de impresión de este tipo: el proceso de [número] envía [int] al proceso de [número de ] en [segundo tiempo nano]. Sin embargo, como resultado de tres rutinas concurrentes, a veces la declaración de impresión no está ejecutando correctamente (medio que no imprimir el trabajo completo, hay algo insertado por otra impresión como el proceso de [número] envía [int] al proceso de [número] en el proceso de [número de ]). Puede cualquier cuerpo me ayuda cómo manejar esto?

¿Fue útil?

Solución

Es imposible identificar la causa del estancamiento debido a que el código que envió no contiene suficiente información.

Puede ser causado por el orden en que se está adquiriendo cerraduras, o puede ser causado por el uso de canales de Van no tamponadas.

Hasta que publique código fuente completo Ir, no hay manera de responder a su pregunta.

Si usted necesita discutir el código de mayor longitud, es probable que debe publicarla en golang-tuercas .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top