我需要等到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
}
答案 0 :(得分:3)
您的代码有两(3)个问题。
首先,你是对的,你在控制调度器的循环中没有任何意义,因此它无法执行更新goroutine。要解决此问题,您可以将GOMAXPROCS
设置为大于1的值,然后可以并行运行多个goroutine。
(但是,因为当你将x传递给更新函数时,这将无济于事,这意味着主goroutine将永远不会在x上看到更新。要解决此问题,您必须通过指针传递x。现在已过时,因为OP修复了代码。)
最后,请注意,由于您没有使用原子载荷和存储,因此您在Addr
上进行了数据竞争。