小编典典

如果在第一次迭代和第二次迭代之间有一小段时间

go

在下面的代码中,迭代运行两次。
是否可能恰好在第一次迭代和第二次迭代之间运行“ test2 <-true”?
我的意思是,在第一次迭代结束而第二次迭代未开始时,是否将true发送给“ test2”?

package main

import "log"
import "time"

func main() {
    test := make(chan bool, 1)
    test2 := make(chan bool, 1)

    go func() {
        for {
            select {
            case <-test:
                log.Println("test")
            case <-test2:
                log.Println("test2")
            }
        }
    }()

    test <- true
    time.Sleep(1)
    test2 <- true
    time.Sleep(1)
}

阅读 270

收藏
2020-07-02

共1个答案

小编典典

是。由于您的频道已缓冲,可以保存1个值。主执行流程可以继续进行,而无需您的匿名goroutine读取您发送到test通道的值,并且可以test2在goroutine唤醒并读取通道上的值之前在通道上发送值test

因为您有时间,所以不太可能发生这种情况。Sleep()调用通常会给goroutine执行时间,但是并没有告诉您在机器非常繁忙,电源处于停电状态的情况下会发生什么情况。不幸的时光或其他您没有想到的事情。

如果您的test通道未缓冲,则该test <- true语句将阻塞,直到您的goroutine接收到该值为止,并且在test2从该test通道接收任何内容之前,该goroutine至少没有接收的可能。

2020-07-02