runtime.GOMAXPROCS()的意义到底是什么

runtime.GOMAXPROCS()的意义到底是什么,第1张

runtime.GOMAXPROCS()的意义到底是什么,第2张

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 执行了一半,被调度了

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » runtime.GOMAXPROCS()的意义到底是什么

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情