package main
import (
"fmt"
"sync"
)
func main() {
var (
i int
wg sync.WaitGroup
)
wg.Add(2)
go func() {
for {
i++
}
}()
go func() {
for {
fmt.Println(i)
}
}()
wg.Wait()
}
这段代码一直输出 0,为什么?
其实这里很简单,
协程是没有机会刷新看到变量的变化的,
变量i虽然是全局变量但并非是线程安全的,
改变它的协程没有机会让出CPU并把它写回内存并且让其他协程及时看到。
楼主说CPU缓存一致性有点高深了,这不是golang自身的原因。所有支持多线程的语言都有这个问题。
#4
更多评论
```go
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var (
i int
wg sync.WaitGroup
)
wg.Add(2)
go func() {
for {
i++
time.Sleep(time.Nanosecond)
}
}()
go func() {
for {
fmt.Println(i)
}
}()
wg.Wait()
}
按照上面给第一个协程加一个延时就没问题,我也没有深入了解原因。
但我知道肯定是多个协程对同一个变量操作的问题。但实际编码时需要对这些变量
加锁,所以这段代码没有啥实际意义,如果你敢把这种不加锁保护变量的代码写到生产环境
肯定是会被骂惨了。
```
#2