为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容森 2021-10-18 16:27:21
我需要等到 x.Addr 更新,但似乎 for 循环没有运行。我怀疑这是由于 go 调度程序造成的,我想知道为什么它会以这种方式工作,或者是否有任何方法可以修复它(没有通道)。package mainimport "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}
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

您的代码有两(三)个问题。

首先,您是对的,循环中没有任何点可以将控制权交给调度程序,因此它无法执行更新 goroutine。为了解决这个问题,你可以设置GOMAXPROCS一个大于 1 的值,然后多个 goroutine 可以并行运行。

(然而,由于它是按值传递 x 给更新函数,这意味着主 goroutine 永远不会看到 x 上的更新。要解决这个问题,你必须通过指针传递 x。现在已经过时了OP 修复了代码。)

最后,请注意,Addr由于您没有使用原子加载和存储,因此存在数据竞争。


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信