关于是否需要同步的问题。
我提前分配了一个数组,然后开多个协程修改这个数组,但是每个协程只修改自己的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
网友评论