加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang,与当地地图的竞争条件

发布时间:2020-12-16 09:28:59 所属栏目:大数据 来源:网络整理
导读:我似乎并不完全理解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)} 现在,无论th
我似乎并不完全理解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的代码,我们将能够提供更多帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读