为什么不处理“无限”循环?

我需要等到 x.Addr 更新,但似乎 for 循环没有运行。我怀疑这是由于 go 调度程序造成的,我想知道为什么它会以这种方式工作,或者是否有任何方法可以修复它(没有通道)。


package main


import "fmt"

import "time"


type T struct {

    Addr *string

}


func main() {


    x := &T{}

    go update(x)

    for x.Addr == nil {

        if x.Addr != nil {

            break

        }

    }

    fmt.Println("Hello, playground")

}


func update(x *T) {

    time.Sleep(2 * time.Second)

    y := ""

    x.Addr = &y

}


慕容森
浏览 171回答 1
1回答

紫衣仙女

您的代码有两(三)个问题。首先,您是对的,循环中没有任何点可以将控制权交给调度程序,因此它无法执行更新 goroutine。为了解决这个问题,你可以设置GOMAXPROCS一个大于 1 的值,然后多个 goroutine 可以并行运行。(然而,由于它是按值传递 x 给更新函数,这意味着主 goroutine 永远不会看到 x 上的更新。要解决这个问题,你必须通过指针传递 x。现在已经过时了OP 修复了代码。)最后,请注意,Addr由于您没有使用原子加载和存储,因此存在数据竞争。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go