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

为什么它不能打印值或替代

为什么它不能打印值或替代

Go
烙印99 2022-08-01 10:15:38
我写了一个退出和同步队列通道预期打印如下,但没有发生,将g1或g2打印值连续按两个我知道无缓冲通道同步规则,但似乎我误解了它g1 0 g2 1 g1 1g2 1g1 2g2 2package mainimport (    "fmt")func main() {    exit := make(chan struct{})    transfer := make(chan int)    go func() {        defer func() {            close(exit)        }()        for i := 0; i < 20; i++ {            transfer <- i            fmt.Println("g1\t", i) // 1        }    }()    go func() {        for i := 0; i < 20; i++ {            <-transfer            fmt.Println("g2\t", i) // 3  4        }    }()    <-exit}
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

因此,当您使用无缓冲通道时,它是阻塞交易;发生的事情是go例程在某个点停止并且需要执行事务;一旦交易发生;两个 go 例程现在都可以向前移动,调度程序需要决定哪个 go 例程将首先运行 g1 和 g2 以相同的顺序打印不是 100%的可能性。


查看完整回答
反对 回复 2022-08-01
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

那是因为这里有数据。

你不能确定在之后和之前不应该有上下文切换到另一个例程。transfer <- ifmt.Println("g1\t", i) // 1

因此,如果您希望这是原子的,则应在此处添加另一种同步机制


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

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