我一直在用goroutines做一些测试,我注意到一个奇怪的行为(对我来说)使用这个代码:
游乐场: https://play.golang.org/p/Py4oqGqkYKm
package main
import (
"fmt"
"sync"
)
var (
mu sync.Mutex
wg sync.WaitGroup
)
func main() {
var x int
for i := 0; i < 10; i++ {
wg.Add(2)
go func() {
mu.Lock()
x = i
mu.Unlock()
wg.Done()
}()
go func() {
mu.Lock()
fmt.Print("x: ", x, " \n")
mu.Unlock()
wg.Done()
}()
wg.Wait()
}
}
我期望输出如下:
x: 0
x: 1
x: 2
x: 3
x: 4
x: 5
x: 6
x: 7
x: 8
x: 9
但我收到了:
x: 0
x: 0
x: 1
x: 2
x: 3
x: 4
x: 5
x: 6
x: 7
x: 8
看起来第二个戈鲁廷被称为第一个(如后进先出)。想到这一点,我试图反转戈鲁廷,我得到了我所期望的答案:
游乐场: https://play.golang.org/p/BC1r3NK6RBm
package main
import (
"fmt"
"sync"
)
var (
mu sync.Mutex
wg sync.WaitGroup
)
func main() {
var x int
for i := 0; i < 10; i++ {
wg.Add(2)
go func() {
mu.Lock()
fmt.Print("x: ", x, " \n")
mu.Unlock()
wg.Done()
}()
go func() {
mu.Lock()
x = i
mu.Unlock()
wg.Done()
}()
wg.Wait()
}
}
输出:
x: 0
x: 1
x: 2
x: 3
x: 4
x: 5
x: 6
x: 7
x: 8
x: 9
任何人都可以帮助我理解这种行为吗?
转到版本:go version go1.16.2 linux/amd64
SMILET
一只名叫tom的猫
相关分类