登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-11 18:42:32 118浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《我怎样才能有两个具有相同功能的 goroutine 来查看彼此的值?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我正在尝试实现一个可以使用两个 goroutine 和不同参数调用的函数。每个人都会操作自己的字符串,并且他们会通过通道将自己的字符串发送给对方并比较结果。这是我的尝试(链接到演示文稿):

func swap_values(str string, strChan1 chan string, strChan2 chan string, done chan bool) {
  str += "test"
  strChan1 <- str
  <-strChan2
  done <- true
}

这就是僵局。对于该函数的两次调用,我交换了通道,因此 strchan1 是每个通道的不同通道。我怎样才能解决这个问题以避免陷入僵局并完成我想要的事情?再次,我将比较字符串并进行额外的操作,这只是获得两者的概念证明。


解决方案


这是死锁,因为两个 goroutine 都试图写入没有人在监听的通道。第一个 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
}

今天关于《我怎样才能有两个具有相同功能的 goroutine 来查看彼此的值?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>