我偶然发现了一个有缺陷的 Golang 代码,该代码试图使用互斥体来防止对 Goroutine 中打印的变量进行更改:
runtime.GOMAXPROCS(1)
mutex := new(sync.Mutex)
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
mutex.Lock()
go func() {
fmt.Println(i, j, i + j);
mutex.Unlock()
}()
}
}
我很清楚,互斥体不会直接锁定,而是在下一次迭代中,当值已经增加时锁定。不清楚的是,根据输出,为什么 j 变量达到 10:
...
0 7 7
0 8 8
0 9 9
1 10 11 <--- isn't supposed to be here
...
1 9 10
2 10 12
...
我尝试调试代码,并j = 10在 i 的外循环增加其值时打印。看起来好像外部循环正在释放线程,允许 goroutine 执行并看到无效值 10。有人可以澄清这种行为吗?
郎朗坤
子衿沉夜
繁星淼淼
相关分类