這打印 0。但是當我在 for 循環中添加空 fmt.Println() 時,它會打印非零值。任何想法為什么?GOMAXPROCS=1 ./foo0package mainimport ( "log" "os" "time")func main() { var i uint64 t := time.AfterFunc(time.Second*1, func() { log.Println(i) os.Exit(0) }) defer t.Stop() for { i++ }}
1 回答

米脂
TA貢獻1836條經驗 獲得超3個贊
你有一個數據競爭:你從多個 goroutine 訪問同一個變量而沒有同步。結果未定義。使用適當的同步。
確實,您不會在代碼中啟動 goroutine,而是引用以下內容time.AfterFunc()
:
AfterFunc 等待持續時間過去,然后在自己的 goroutine 中調用 f。
所以你有main
goroutine 遞增(寫入) variable i
,你將有另一個 goroutine 執行你傳遞給time.AfterFunc()
它的函數,它將讀取i
。
使用同步的示例:
var (
mu sync.Mutex
i uint64
)
t := time.AfterFunc(time.Second*1, func() {
mu.Lock()
log.Println(i)
mu.Unlock()
os.Exit(0)
})
defer t.Stop()
for {
mu.Lock()
i++
mu.Unlock()
}
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消