Tôi chắc chắn rằng có một lời giải thích đơn giản cho tình huống tầm thường này, nhưng tôi mới với mô hình đồng thời go
.Tại sao sử dụng kênh không bị chặn trong cùng một goroutine cho một bế tắc
khi tôi chạy ví dụ này
package main
import "fmt"
func main() {
c := make(chan int)
c <- 1
fmt.Println(<-c)
}
tôi nhận được lỗi này:
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
Tại sao?
Bao bì c <-
trong một goroutine
làm cho ví dụ chạy như chúng tôi mong đợi
package main
import "fmt"
func main() {
c := make(chan int)
go func(){
c <- 1
}()
fmt.Println(<-c)
}
Một lần nữa, tại sao?
Xin vui lòng, tôi cần giải thích sâu sắc, không chỉ làm thế nào để loại bỏ bế tắc và sửa mã.
Tôi thấy khó mà nghĩ, có ba tình huống: 1) kênh không bị chặn mà không có goroutine mới -> bế tắc, 2) kênh đệm mà không có goroutine mới -> không bế tắc 3) kênh không bị chặn với goroutine mới -> chạy. – tarrsalah
Khi kênh đầy, phải có một goroutine để nhận những gì người gửi gửi đi, hoặc người gửi khác chặn cho đến khi kênh đến. Bạn có thể thấy một kênh không bị chặn là kênh luôn đầy đủ. –
Cảm ơn @ dystry, tôi sẽ suy nghĩ về nó, chạy một số mã, đọc về đi đồng thời nhiều hơn ... – tarrsalah