gpt4 book ai didi

go - 与 make channel 相关的奇怪死锁

转载 作者:IT王子 更新时间:2023-10-29 02:02:56 26 4
gpt4 key购买 nike

我遇到了 Go channel 的奇怪行为。问题描述如下。

package main

import "fmt"

func main() {
ch := make(chan int)

fmt.Println("len:", len(ch))
fmt.Println("cap:", cap(ch))
fmt.Println("is nil:", ch == nil)

go func(ch chan int){
ch <- 233
}(ch)

fmt.Println(<- ch)

}

当我运行上面的代码时,我得到了这样的结果:

len: 0
cap: 0
is nil: false
233

channel chlencap 看起来很奇怪,但代码仍然有效。但是当我运行这段代码时:

package main

import "fmt"

func main() {
ch := make(chan int)

fmt.Println("len:", len(ch))
fmt.Println("cap:", cap(ch))
fmt.Println("is nil:", ch == nil)

ch <- 233 // Here changes!

fmt.Println(<- ch)

}

结果变成了:长度:0上限:0为零:假 fatal error :所有 goroutines 都睡着了 - 死锁!

goroutine 1 [chan send]:
main.main()
/tmp/sandbox640280398/main.go:12 +0x340

更重要的是,当我像下面这样更改第二个代码片段时:包主

import "fmt"

func main() {
ch := make(chan int, 1) //Here changes!

fmt.Println("len:", len(ch))
fmt.Println("cap:", cap(ch))
fmt.Println("is nil:", ch == nil)

ch <- 233

fmt.Println(<- ch)

}

事情又成功了,我得到了:

len: 0
cap: 1
is nil: false
233

所以,谁能告诉我以下问题:

  1. 为什么 ma​​ke(chan int) 返回具有 len 和 上限的 channel ,但在第一个代码中仍然可以正常工作一 block ?

  2. 为什么第二个代码在 main 函数中使用 channel 而不是新的 goroutine 导致死锁?

  3. 为什么我在第三段代码中给ma​​ke加一个cap参数就可以解决问题?

  4. channel (第一和第二代码)与 nil channel 有什么区别?

最佳答案

您可以创建两种类型的 channel :缓冲 channel 和非缓冲 channel 。
缓冲 channel 是那些具有容量的 channel :make(chan int, 10)
缓冲 channel 允许您向其中发送与其容量相同数量的消息而不会被阻塞。
无缓冲 channel 没有容量,这就是为什么您的发送 goroutine 将被阻塞,直到另一个 goroutine 收到它。

1. 无缓冲 channel 。在新的 goroutine 向它发送消息之前,你的主 goroutine 在从 channel 接收时被阻塞。

2. 因为您使用的是无缓冲 channel ,所以您的发送 goroutine 会被阻塞,直到另一个 goroutine 接收到它,但是除了主 goroutine 之外您没有其他 goroutine,因此程序处于死锁状态。

3. 由于缓冲 goroutine。它的容量为 1,因此向它发送一条消息然后在同一个 goroutine 中接收它不会有问题。但是,如果您尝试向它发送超过 1 条消息,您将被阻止。 ch <- 233; ch <- 233 - 此代码将导致死锁。

4. 明白您的意思...,但是如果您尝试接收或发送到 nil channel ,您将被阻止:var ch chan int; <-chvar ch chan int; ch <- 1

关于go - 与 make channel 相关的奇怪死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45366954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com