Go通道,看起来没问题,但会出现死锁。

huangapple go评论81阅读模式
英文:

go channel, seems all right, but it gets deadlock

问题

package main
import "fmt"
import "time"

func main() {
     c := make(chan int)
     c <- 42    // 向通道 c 写入数据

     val := <-c // 从通道 c 读取数据
     println(val)
}

我认为 c <- 42 是将 42 写入通道 c,然后 val := <-c 是将通道 c 中的值读取到 val 中。
但为什么会出现死锁呢?

英文:
package main
import &quot;fmt&quot;
import &quot;time&quot;

func main() {
     c := make(chan int)
     c &lt;- 42    // write to a channel

     val := &lt;-c // read from a channel
     println(val)
}

I think c &lt;- 42 put 42 to channel c, then val := &lt;-c put value in c to val.
but why does it get deadlock?

答案1

得分: 5

你创建了一个非缓冲通道。因此,语句c <- 42会阻塞,直到其他goroutine尝试从通道接收值。由于没有其他goroutine来执行接收操作,你遇到了死锁。有两种方法可以解决这个问题:

  1. 在一个不同的goroutine中执行接收操作。
  2. 给通道添加缓冲区。例如,c := make(chan int, 1)可以让你在通道上发送一个值而不会阻塞。
英文:

You have created an unbuffered channel. So the statement c &lt;- 42 will block until some other goroutine tries to receive a value from the channel. Since no other goroutine is around to do this, you got a deadlock. There are two ways you could fix this:

  1. Perform the receive in a different goroutine.
  2. Add a buffer to the channel. For example, c := make(chan int, 1) would allow you to send a single value on the channel without blocking.

huangapple
  • 本文由 发表于 2014年8月28日 10:14:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/25539684.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定