runtime.GOMAXPROCS()的意义到底是什么
func main() {
num := runtime.GOMAXPROCS(1)
fmt.Println(num)
c := make(map[int]int)
for i := 0; i < 100; i++ {
go func() {
for j := 0; j < 1000000; j++ {
c[j] = j
}
}()
}
time.Sleep(10000*time.Second)
}
我搜索到的文档,都是说 runtime.GOMAXPROCS()
是设置实际并发执行的个数,我设置为 1 后,这段代码还是会报致命错误 fatal error: concurrent map writes
所以这个设置是失效了吗? mac 下 golang1.8
答:错误信息不是写的很清楚么,你的代码在起 goroutine 并发写 map
答:golang 中 map 不允许并行操作而已,百度一下报错你就知道_(:з」∠)_连谷歌都用不到
答:这个并发错误,只是跟开启了多协程并发写 map 有关,跟你设一个 cpu 无关啊。一个 cpu 也可以跑很多个并发协程的啊。。。你可以把协程理解为跟线程类似,但是比线程更轻量级的东西,一个 cpu 也可以跑多线程的吧。。。
答:runtime.GOMAXPROCS()是设 cpu 数量,不是控制协程数量
要想不报错,你得控制同一时刻只能有一个协程写 map,比如加锁什么的
答:对 map 进行修改的操作不是原子的,所以可能某个协程在修改中途被抢占。
答:map 操作不是原子的,可能一个 goroutine 执行了一半,被调度了
0条评论