у меня есть этот упрощенный фрагмент кода (или здесь 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', т.е.эта переменная FIRST увеличивается, а условие THEN проверяется. Это объясняет 5s –