为什么没有处理“无限”for循环?

时间:2015-07-02 08:37:17

标签: go

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

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
}

1 个答案:

答案 0 :(得分:3)

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

首先,你是对的,你在控制调度器的循环中没有任何意义,因此它无法执行更新goroutine。要解决此问题,您可以将GOMAXPROCS设置为大于1的值,然后可以并行运行多个goroutine。

(但是,因为当你将x传递给更新函数时,这将无济于事,这意味着主goroutine将永远不会在x上看到更新。要解决此问题,您必须通过指针传递x。现在已过时,因为OP修复了代码。)

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