gpt4 book ai didi

go - 为什么当我有两个 go-routines 时循环代码不执行

转载 作者:IT王子 更新时间:2023-10-29 02:00:36 24 4
gpt4 key购买 nike

我在 golang 中遇到问题

var a = 0
func main() {
go func() {
for {
a = a + 1
}
}()
time.Sleep(time.Second)
fmt.Printf("result=%d\n", a)
}
  • 预期:结果=(一个大整数)
  • 结果:结果=0

最佳答案

你有一个竞争条件,使用 -race 标志运行你的程序

go run -race main.go
==================
WARNING: DATA RACE
Read at 0x0000005e9600 by main goroutine:
main.main()
/home/jack/Project/GoProject/src/gitlab.com/hooshyar/GoNetworkLab/StackOVerflow/race/main.go:17 +0x6c

Previous write at 0x0000005e9600 by goroutine 6:
main.main.func1()
/home/jack/Project/GoProject/src/gitlab.com/hooshyar/GoNetworkLab/StackOVerflow/race/main.go:13 +0x56

Goroutine 6 (running) created at:
main.main()
/home/jack/Project/GoProject/src/gitlab.com/hooshyar/GoNetworkLab/StackOVerflow/race/main.go:11 +0x46
==================
result=119657339
Found 1 data race(s)
exit status 66

什么是解决方案?
有一些解决方案,一个解决方案是使用互斥体:

var a = 0
func main() {
var mu sync.Mutex

go func() {
for {
mu.Lock()
a = a + 1
mu.Unlock()
}
}()
time.Sleep(3*time.Second)
mu.Lock()
fmt.Printf("result=%d\n", a)
mu.Unlock()
}

在任何读写锁定互斥锁然后解锁它之前,现在你没有任何竞争,最后结果将是 bi big int。
有关详细信息,请阅读本主题。
Data races in Go(Golang) and how to fix them还有这个

Golang concurrency - data races

关于go - 为什么当我有两个 go-routines 时循环代码不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56678481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com