我需要等到 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
由于您没有使用原子加载和存储,因此存在数据竞争。
- 1 回答
- 0 关注
- 170 浏览
添加回答
举报
0/150
提交
取消