Quando executo o seguinte código:
import (
"log"
"sync"
"testing"
"time"
)
func TestConcurrency(t *testing.T) {
var mutex sync.RWMutex
dictionary := make(map[interface{}]interface{})
go func() {
var value interface{}
for {
go func() {
mutex.Lock()
dictionary["Key"] = ""
mutex.Unlock()
}()
go func() {
mutex.RLock()
value = dictionary["Key"]
mutex.RUnlock()
}()
}
log.Println(value)
}()
}
usando:
go test -race fileName.go
Isso resulta em:
Found 1 data race(s)
Como posso resolver isso?
Tenho muitas gravações e leituras simultâneas.
Se você olhar o erro apresentado pelo detector de corrida, verá que ele relatou gravações simultâneas na value = dictionary["Key"]
linha, o que significa que a corrida detectada está ativada value
, não dictionary
.
Você está acessando simultaneamente 2 variáveis dictionary
e value
. Você não pode usar o bloqueio de leitura para proteger leituras no mapa e gravações na value
variável. Você precisa de um segundo mutex ou precisa sempre usar mutex.Lock
para serializar o acesso a ambas as variáveis.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras