美文网首页
多协程同时修改数组

多协程同时修改数组

作者: ironman_ | 来源:发表于2018-11-12 21:13 被阅读0次

关于是否需要同步的问题。
我提前分配了一个数组,然后开多个协程修改这个数组,但是每个协程只修改自己的index,这个时候需不需要同步呢?

func main() {
    var wg sync.WaitGroup
    data := make([]int, 1000)
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go doSomething(i, &wg, &data)
    }
    wg.Wait()
    fmt.Println("all done")
    for index, val := range data {
        if index+1 != val {
            fmt.Println(fmt.Sprintf("data error, index:%d, value:%d", index, val))
        }
    }
    fmt.Println("all checked")
}

func doSomething(index int, wg *sync.WaitGroup, data *[]int) {
    defer wg.Done()
    (*data)[index] = index + 1
    fmt.Println("change data index:" + strconv.Itoa(index))
}

这里在协程里将数据设置成index+1,然后等到全部修改完成之后再去检查是否有错误的数据,发现检查全部通过。

all done
all checked

是什么原因呢?

最后在Stack Overflow上找到了答案:
这里修改的是数组的每个元素,相当于修改多个变量,所以这里不需要同步。
https://stackoverflow.com/questions/49879322/can-i-concurrently-write-different-slice-elements

相关文章

网友评论

      本文标题:多协程同时修改数组

      本文链接:https://www.haomeiwen.com/subject/gflhfqtx.html