为了账号安全,请及时绑定邮箱和手机立即绑定

GO 协程 为什么这样会造成死锁

GO 协程 为什么这样会造成死锁

肥皂起泡泡 2019-05-11 16:42:32
packagemainimport("fmt")funcf1(inchanint){fmt.Println(
查看完整描述

3 回答

?
ThomasHuke

TA贡献5条经验 获得超2个赞

package main

import (
   "fmt"
   "time"
)

func f1(in chan int) {
   fmt.Println(<-in)
}
func main() {
   out := make(chan int)
   go func() {
      out <- 2
   }()

    f1(out)
   time.Sleep(time.Second)
}



//或者:


package main

import (
   "fmt"
   "time"
)

func f1(in chan int) {
   fmt.Println(<-in)
}
func main() {
   out := make(chan int,2)
   out <- 2
   go f1(out)
   time.Sleep(time.Second)
}


查看完整回答
反对 回复 2019-05-22
?
哔哔one

TA贡献1854条经验 获得超8个赞

改成这样:
packagemain
import(
"fmt"
)
funcf1(inchanint){
fmt.Println(<-in)
}
funcmain(){
out:=make(chanint)
gof1(out)
out<-2
}
因为你make是不带缓冲的chan所以chan需要有人消费才能写入,不然会阻塞因此还有第二种方法,生成带缓冲的chan:
make(chanint,1)
                            
查看完整回答
反对 回复 2019-05-11
?
Qyouu

TA贡献1786条经验 获得超11个赞

out队列无缓冲,主线程会阻塞在这里。解决方法有两个。
第一,设置缓冲:
packagemain
import(
"fmt"
)
funcf1(inchanint){
fmt.Println(<-in)
}
funcmain(){
out:=make(chanint,1)
out<-2
gof1(out)
}
第二,将gof1(out)提前:
packagemain
import(
"fmt"
)
funcf1(inchanint){
fmt.Println(<-in)
}
funcmain(){
out:=make(chanint)
gof1(out)
out<-2
}
                            
查看完整回答
反对 回复 2019-05-11
  • 3 回答
  • 0 关注
  • 927 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信