gpt4 book ai didi

go - 为什么我的 for 循环只在我放慢速度时才起作用?

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:24 24 4
gpt4 key购买 nike

此代码打印 0,但如果我将 time.Sleep(0) 插入更新程序循环,它打印 >1

var Nonce int = 0

func Updater(){
for{
Nonce += 1
}
}

func main(){
go Updater()
time.Sleep(time.Second)
fmt.Printf("%d\n",Nonce)
}

最佳答案

nonce.go:

package main

import (
"fmt"
"time"
)

var Nonce int = 0

func Updater() {
for {
Nonce += 1
}
}

func main() {
go Updater()
time.Sleep(time.Second)
fmt.Printf("%d\n", Nonce)
}

首先,Go gc 编译器是一个优化编译器。 goroutine 之间没有同步。因此 Nonce += 1 语句被省略,Nonce 的值保持为零。查看编译后的代码:

$ go build nonce.go
$ objdump -d -S ./nonce

输出:

var Nonce int = 0

func Updater() {
for {
Nonce += 1
4888f0: eb fe jmp 4888f0 <main.Updater>
4888f2: cc int3
}
}

其次,如果我们运行 Go 数据竞争检测器,一些优化会被抑制。因此,检测到 Nonce 变量的数据竞争条件。数据竞争的结果是不确定的。

$ go run -race nonce.go
==================
WARNING: DATA RACE
Read at 0x0000005f2648 by main goroutine:
main.main()
/home/peter/gopath/src/nonce.go:19 +0x63

Previous write at 0x0000005f2648 by goroutine 6:
main.Updater()
/home/peter/gopath/src/nonce.go:12 +0x56

Goroutine 6 (running) created at:
main.main()
/home/peter/gopath/src/nonce.go:17 +0x46
==================
42758109
Found 1 data race(s)
exit status 66
$

关于go - 为什么我的 for 循环只在我放慢速度时才起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54578762/

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