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

我怎样才能有两个具有相同功能的 goroutine 来查看彼此的值?

我怎样才能有两个具有相同功能的 goroutine 来查看彼此的值?

Go
慕斯王 2022-05-18 13:57:49
我正在尝试实现一个可以使用两个 goroutine 和不同参数调用的函数。每个人都将操纵自己的字符串,他们将通过一个通道将他们的字符串发送给彼此并比较结果。这是我的尝试(Go Playground 链接):func swap_values(str string, strChan1 chan string, strChan2 chan string, done chan bool) {  str += "test"  strChan1 <- str  <-strChan2  done <- true}这是僵局。对于我对该函数的两次调用,我交换了通道,因此 strChan1 是每个不同的通道。我怎样才能解决这个问题以不死锁并完成我想要的?同样,我将比较字符串并进行额外的操作,这只是获得两者的概念证明。
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

这是死锁,因为两个 goroutine 都试图写入没有人在听的通道。第一个 goroutine 尝试写入一个通道,由于第二个没有从它读取,所以它被卡在那里。第二个 goroutine 做同样的事情,所以他们都停下来,互相等待。


处理这个问题的最简单方法是使用大小为 1 的通道,因此无需等待读者即可继续写入。


strChan1 := make(chan string,1)

strChan2 := make(chan string,1)

如果必须使用长度为 0 的通道,则需要使用 select 来适应 goroutine 的不同排序:


select {

  case strChan1 <- str:

     <-strChan2

  case <-strChan2:

     strChan1 <- str

}


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

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