Error en un punto muerto mutuamente concurrente Ir Rutinas
-
27-10-2019 - |
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?
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 .