初学者级别代码的死锁

deadlock at beginner level code

这是我的主要函数的主体;

c := make(chan int)

go func() {

    i := <-c
    i++
    time.Sleep(100 * time.Millisecond)

    c <-i


}()

time.Sleep(1 * time.Second)
go func() {
    i := <-c
    i++
    time.Sleep(100 * time.Millisecond)
    c <-i

}()

time.Sleep(1 * time.Second)
fmt.Println(<-c)

我遇到了僵局 error.even 我试过 waitgroups.hella 撕破了我的头发。

解释答案对我来说非常好。

您在写入通道之前先从通道读取数据,因此一切都在等待读取,而这种情况永远不会发生。

您可以通过在调用 Printf 之前放置 c <- 0 来打破僵局,但程序随后可能会打印 0、1 或 2。请注意,如果您将初始发送放在您之前启动第一个 goroutine 你从另一个方向得到同样的问题,一个没有可能读取的发送。

如果您说出了您正在尝试做的事情,那么提供帮助会容易得多,因为我无法提供任何具体的指示。

在最后一行之前添加:

c <- 0

通过这种方式,您可以提供起始值,goroutine 可以读取该值以开始工作。您还可以在最后一行(发送到通道)之前添加到两个 goroutines 添加打印 goroutine 编号和值:

fmt.Println("goroutine 1 value", i)

您可以看到在渠道中同一商品的 3 个可能消费者的情况下如何传递值。主 goroutine 很可能会读取频道,你会得到 0。加Sleep给别人机会。玩弄睡眠时间以获得不同的结果。

你有一个无缓冲通道,这意味着你的工作 "synch" 我的意思是,当使用一个无缓冲通道时,你需要一个作家和一个 reader 来实现一些尝试缓冲通道,因为你可以尝试一个 select 等待消息。 2 - 您在从无缓冲通道写入之前读取,该通道将阻塞直到发生写入操作。所以你从一个阻塞的频道中得到了 2 readers(因为没有作者)。