初学者级别代码的死锁
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(因为没有作者)。
这是我的主要函数的主体;
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(因为没有作者)。