我有这样的简单的一段代码(或此处https://play.golang.org/p/KW8_OHUp9v)互斥导致意想不到输出
package main
import (
"fmt"
"sync"
)
func main() {
mutex := new(sync.Mutex)
for i := 1; i < 5; i++ {
for j := 1; j < 5; j++ {
mutex.Lock()
go func() {
fmt.Printf("%d + %d = %d\n", i, j, j+i)
mutex.Unlock()
}()
}
}
}
它产生这样
1 + 2 = 3
1 + 3 = 4
1 + 4 = 5
2 + 5 = 7
2 + 2 = 4
2 + 3 = 5
2 + 4 = 6
3 + 5 = 8
3 + 2 = 5
3 + 3 = 6
3 + 4 = 7
4 + 5 = 9
4 + 2 = 6
4 + 3 = 7
4 + 4 = 8
Program exited.
输出寻找在输出我很惊讶几件事:
- 没有'1的
j
- 有“5的用于
j
- 只有3个值,对于i = 1,代替4-
我可以理解缺乏” 1',因为它被写入之前的变量被递增。
有人可以解释2.和3.?
请注意,您错过了最后的'4 + 4',因为您并未等待最后的goroutine完成。 https://play.golang.org/p/lPQWfvAV5S – JimB
我知道,传递'i'和'j'作为函数参数会有帮助。我错过了'for'循环的基础知识,即。该变量首先递增,然后检查THEN条件。这解释了5s –