golang cpu缓存一致性问题

json7 · · 1165 次点击
其实这里很简单, 协程是没有机会刷新看到变量的变化的, 变量i虽然是全局变量但并非是线程安全的, 改变它的协程没有机会让出CPU并把它写回内存并且让其他协程及时看到。 楼主说CPU缓存一致性有点高深了,这不是golang自身的原因。所有支持多线程的语言都有这个问题。
#4
更多评论
线程的变量是复制一份的。不是指针传递,所以一直是0, 这个是局部变量。其他线程不可见
#1
jan-bar
想要拥有,必定付出。
```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