Я предполагаю, что ваш fetch := map[string]int{some data}
на самом деле должен был быть: fetch := map[string][]int{..some data..}
.
Чтобы это была гонка, threadfunc
должно изменить значение в пределах fetchlocal
или что-то еще должно изменить значение в пределах fetch
.
Это означает, что срез на самом деле:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
Когда вы копируете элементы с одной карты на другую, вы не делаете глубокую копию срезов (вы просто создаете новую структуру с теми же данными, длиной, колпачком), то есть так сказать fetch["foo"].Data == fetchlocal["foo"].Data
.
Следовательно, вы можете сказать fetch[someExistingKey] = someNewValue
, и это не будет гонкой с threadfunc
, но если вы скажете fetch[someExistingKey][x] == foobar
или fetchlocal[someExistingKey][x] == foobar
, гонка начнется.
Если fetchlocal
нужно изменить на threadfunc
, вы можете изменить свой внутренний цикл, чтобы он выглядел так:
for key, value := range fetch {
if condition {
newVal := make([]int, len(value))
copy(newVal, val)
fetchlocal[key] = newVal
}
}
Или, альтернативно, сделайте копию внутри threadfunc
по мере необходимости перед мутацией.
P.S. Если вы поделились своим фактическим threadfunc
или кодом, изменяющим fetch
во время работы этих двух циклов, мы сможем помочь больше.
person
voidlogic
schedule
21.06.2014
for condition {
вы порождаете новую горутину для обработкиfetchlocal
, таким образом, если вашthreadlocal
работает достаточно долго, ваш внутренний циклrange
может/изменит вашmap
.map
не является потокобезопасной структурой данных в Go. Кроме того, это поможет нам ответить, если вы также предоставитеthreadfunc
источник. - person Kavu   schedule 10.04.2014threadfunc
не меняетfetch
, гонки быть не должно, но могу ошибаться. - person OneOfOne   schedule 10.04.2014some data
выше? Если это данные, которые могут быть измененыtheadfunc
, тогда будет гонка. См. play.golang.org/p/FWEz-OEfkq. - person djd   schedule 15.05.2014