package main
import (
"fmt"
)
var complete chan string = make(chan string)
func printstring(i int) {
fmt.Println("打印这里", i)
complete <- "妥了"
}
func main() {
go printstring(1)
msg := <-complete
fmt.Println(msg)
printstring(2)
}
已经有一写一读,为什么还会死锁?怎么样才能不死锁呢?
第 1 条附言 ·
上面的兄弟说无缓冲区有写入必须有读取这个意思的,那要是我只在main中执行:go printstring(1) time.Sleep(3 * time.Second) 这样还是正常执行的 又怎么理解?
第 2 条附言 ·
看了下面的分析感觉快理解了,再多测试几下发现又蒙蔽了
问题这里锁死的根本原因就是缓存区满了啊。
缓存区为0,无法写入,满了。
那如果缓存区为1,结果写入了2个数据,一样满了,也会死锁啊。
所以你就算缓存区部位0,也不能解决问题,反而使得问题隐藏的更深,带来跟多的问题。
这个不光实在体现在chan上,实际socket之类的链接都会有同样的问题
随便搜索下,比如
http://wiki.jikexueyuan.com/project/java-socket/socket-tcp-deadlock.html
http://www.voidcn.com/article/p-cbjwyyjf-btm.html
#13