相关疑难解决方法(0)

为什么在同一个goroutine中使用无缓冲通道会导致死锁

我确信这个微不足道的情况有一个简单的解释,但我是go并发模型的新手.

当我运行这个例子

package main

import "fmt"

func main() {
    c := make(chan int)    
    c <- 1   
    fmt.Println(<-c)
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /home/tarrsalah/src/go/src/github.com/tarrsalah/tour.golang.org/65.go:8 +0x52
exit status 2
Run Code Online (Sandbox Code Playgroud)

为什么?


包装c <-在一个goroutine使得示例运行正如我们预期的那样

package main

import "fmt"

func main() {
    c := make(chan int)        
    go func(){
       c <- 1
    }()
    fmt.Println(<-c)
}
Run Code Online (Sandbox Code Playgroud)

再次,为什么?

请,我需要深入解释,而不仅仅是如何消除死锁并修复代码.

concurrency go channels

46
推荐指数
3
解决办法
2万
查看次数

缓冲/无缓冲通道

有人可以解释一下,为什么如果通道被缓冲,程序不会以fatal_error退出?

无缓冲的频道

package main

func main() {
    c := make(chan int)
    c <- 3
}

fatal error: all goroutines are asleep - deadlock!
Run Code Online (Sandbox Code Playgroud)

缓冲频道

package main

func main() {
    c := make(chan int, 1)
    c <- 3
}

[no output]

Program exited.
Run Code Online (Sandbox Code Playgroud)

谢谢!

go

8
推荐指数
2
解决办法
3114
查看次数

c:= make(chan int)和c:= make(chan int,1)之间有什么区别?

我认为它们是相同的,但是在go内存模型中有这样的词:如果通道被缓冲(例如c = make(chan int, 1)),那么程序将不能保证打印"hello,world" - 它可能会打印出空字符串,崩溃或做其他事情.它是否正确?

channel go

3
推荐指数
2
解决办法
1589
查看次数

标签 统计

go ×3

channel ×1

channels ×1

concurrency ×1