golang 的 data race 示例,没太理解

2022-10-20 18:52:26 +08:00
 wtfedc

代码:

package main
func main() {
	c := make(chan bool)
	m := make(map[string]string)
	go func() {
		m["1"] = "a" // First conflicting access.
		c <- true
	}()
	m["2"] = "b" // Second conflicting access.
	<-c
	for k, v := range m {
		fmt.Println(k, v)
	}
}

执行 go run -race test.go,结果为

WARNING: DATA RACE
Write at 0x00c00011c180 by goroutine 7:
  runtime.mapassign_faststr()
      /usr/local/Cellar/go/1.18/libexec/src/runtime/map_faststr.go:203 +0x0
  main.main.func1()
      /Users/admin/Downloads/test.go:9 +0x50

Previous write at 0x00c00011c180 by main goroutine:
  runtime.mapassign_faststr()
      /usr/local/Cellar/go/1.18/libexec/src/runtime/map_faststr.go:203 +0x0
  main.main()
      /Users/admin/Downloads/test.go:12 +0x127

Goroutine 7 (running) created at:
  main.main()
      /Users/admin/Downloads/test.go:8 +0x10a
==================
1 a
2 b
Found 1 data race(s)
exit status 66

官方文档: https://go.dev/doc/articles/race_detector

大概了解了一下 Memory Model ,还有 CPU 的乱序执行什么的,对这个例子还是不太理解,有没有大佬指点一二。

765 次点击
所在节点    问与答
2 条回复
dongtingyue
2022-10-20 18:56:29 +08:00
出现 RACE 就说明存在多个线程同时操作数据的情况,需要加锁
wtfedc
2022-10-20 19:01:28 +08:00
@dongtingyue 突然反应到,我对 map 的理解可能不太对,还以为修改不同的 key ,就可以并发写。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/888503

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX