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

我写了一个退出和同步队列通道


预期打印如下,但没有发生,将g1或g2打印值连续按两个我知道无缓冲通道同步规则,但似乎我误解了它


g1 0 

g2 1 

g1 1

g2 1

g1 2

g2 2


package main


import (

    "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

}


烙印99
浏览 89回答 2
2回答

胡说叔叔

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

元芳怎么了

那是因为这里有数据。你不能确定在之后和之前不应该有上下文切换到另一个例程。transfer <- ifmt.Println("g1\t", i) // 1因此,如果您希望这是原子的,则应在此处添加另一种同步机制
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go