【问题标题】:go channel, seems all right, but it gets deadlock进入频道,看起来没问题,但它陷入僵局
【发布时间】:2014-10-21 18:39:56
【问题描述】:
package main
import "fmt"
import "time"

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

     val := <-c // read from a channel
     println(val)
}

我认为c &lt;- 42 将 42 放入通道 c,然后 val := &lt;-c 将 c 中的值放入 val。 但是为什么会死锁呢?

【问题讨论】:

    标签: go synchronization channel


    【解决方案1】:

    您已经创建了一个无缓冲通道。因此,c &lt;- 42 语句将阻塞,直到其他一些 goroutine 尝试从通道接收值。由于没有其他 goroutine 可以执行此操作,因此您遇到了死锁。有两种方法可以解决此问题:

    1. 在不同的 goroutine 中执行接收。
    2. 将缓冲区添加到通道。例如,c := make(chan int, 1) 将允许您在通道上发送单个值而不会阻塞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 2021-05-04
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多