Golang,与当地地图的竞争条件
我似乎并不完全理解Go中的地图.
我有这个代码: fetch := map[string]int{some data} for condition { fetchlocal := map[string]int{} for key,value := range fetch { if condition { fetchlocal[key] = value } } go threadfunc (fetchlocal) } 现在,无论threadfunc函数使用fetchlocal变量,Go(go -race)都会发出警告:数据竞争.我也有一些恐慌.但为什么? fetchlocal变量不被任何其他goroutine使用. 有人可以开导我吗? 解决方法
我假设你的fetch:= map [string] int {some data}实际上应该是:fetch:= map [string] [] int {.. some data ..}.
要成为一个种族,threadfunc必须在fetchlocal中更改一个值,否则必须更改fetch中的值. 这就是说切片实际上是: type SliceHeader struct { Data uintptr Len int Cap int } 当您将元素从一个映射复制到另一个映射时,您没有对切片进行深层复制(您只是创建一个具有相同Data,Len,Cap的新结构),即fetch [“foo”].数据== fetchlocal [“foo”].数据. 因此你可以说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内部进行复制. 附:如果您在这两个循环运行时共享了实际的threadfunc或修改fetch的代码,我们将能够提供更多帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |