Salut à tous,
J’ai un peu de temps libre et j’expérimente avec Go.
j’ai fait un programme qui accepte toutes les connexions, et les gère dans une goroutine qui gère l’ajout de connexion à un pool et envois les messages en queue à ce même pool
Le pool est un simple tableau
Le problème c’est que j’accède de manière concurrente (parallèle?) à mon pool, est-ce que c’est une data-race ?
func handleCo(incommingConn <-chan *Connection, masterCom <-chan []byte) {
log.Print("handling Conn")
arrayConn := make([]*Connection, 0)
//always add connection to the pool
go func() {
for {
arrayConn = append(arrayConn, <-incommingConn)//block until there is a new co
log.Printf("bot added")
}
}()
//write msg from masterChan to
go func() {
for {
for msg := range masterCom {
for i := range arrayConn {
_, werr := arrayConn[i].conn.Write(msg)
if werr != nil {
log.Fatal(werr)
}
}
}
}
}()
}
EDIT:
$: ~/go/src/echo/server$ go test -race
==================
WARNING: DATA RACE
Write at 0x00c000110000 by goroutine 15:
echo/server.handleCo.func1()
/Users/d3m0t3p/go/src/echo/server/echoServer.go:25 +0x122
Previous read at 0x00c000110000 by goroutine 16:
echo/server.handleCo.func2()
/Users/d3m0t3p/go/src/echo/server/echoServer.go:35 +0x71
Goroutine 15 (running) created at:
echo/server.handleCo()
/Users/d3m0t3p/go/src/echo/server/echoServer.go:23 +0x11b
Goroutine 16 (running) created at:
echo/server.handleCo()
/Users/d3m0t3p/go/src/echo/server/echoServer.go:31 +0x147
Apparemment il y a une data race, vous auriez une autre architecture à me proposer ou alors un moyen de syncroniser ça, je sais pas vraiment comment faire en go pour utiliser des mutex
+0
-0