Go 关于关键词的比较;围棋;在戈罗廷没有
以下代码记录了一个错误: 致命错误:所有goroutine都处于休眠状态-死锁Go 关于关键词的比较;围棋;在戈罗廷没有,go,channel,goroutine,Go,Channel,Goroutine,以下代码记录了一个错误: 致命错误:所有goroutine都处于休眠状态-死锁 主程序包 输入“fmt” func main(){ ch:=制造(成交量) ch死锁发生的原因: 在第一个代码段中,您只有一个主goroutine,当您试图在此处写入通道时,它被阻止: ch <- 1 从 仅当缓冲区已满时才发送到缓冲通道块 因此,您可以写入通道,直到缓冲区已满。然后必须有人开始从通道读取 选项2:从goroutine写入通道,就像您在第二个代码段中所做的那样: func assign(ch
主程序包
输入“fmt”
func main(){
ch:=制造(成交量)
ch死锁发生的原因:
在第一个代码段中,您只有一个主goroutine,当您试图在此处写入通道时,它被阻止:
ch <- 1
从
仅当缓冲区已满时才发送到缓冲通道块
因此,您可以写入通道,直到缓冲区已满。然后必须有人开始从通道读取
选项2:从goroutine写入通道,就像您在第二个代码段中所做的那样:
func assign(ch chan int) {
ch <- 1
}
func main() {
ch := make(chan int)
go assign(ch) // does not block the main goroutine
fmt.Println(<-ch) // waiting to read from the channel
}
func赋值(ch chan int){
ch当您使用无缓冲通道时,goroutine在写入期间被阻止,直到有人执行读取。
在您的第一个代码片段中,有一个无缓冲通道和一个goroutine(主goroutine)。
因此,当你试图写作时:
ch <- 1
使用缓冲通道(第三个代码段)时,可以在不阻塞goroutine的情况下执行N
写入操作(其中N
是缓冲区的大小)。
这就是为什么在您的示例中,您在没有阻塞的情况下进行了2次写入,并且以后可以读取它们。但是,如果您的缓冲区小于写入操作的计数,并且没有人执行读取操作,则您将陷入相同的阻塞问题(请参阅1和2个代码段的说明)。再次感谢!可以将其解释为“发送和接收数据块,直到另一端准备就绪”?
ch <- 1
ch := make(chan int, 1) // buffer length is set to 1
func assign(ch chan int) {
ch <- 1
}
func main() {
ch := make(chan int)
go assign(ch) // does not block the main goroutine
fmt.Println(<-ch) // waiting to read from the channel
}
ch <- 1
fmt.Println(<-ch)
package main
import "fmt"
func print(ch chan int) {
fmt.Println(<-ch)
}
func main() {
ch := make(chan int)
go print(ch)
ch <- 1
}