当前位置: 首页 > 知识库问答 >
问题:

goroutines僵局,需要一些解释

储国发
2023-03-14

我想知道这里的日常工作是如何进行的。

  1 package main
  2 
  3 import "fmt"
  4 
  5 func main() {
  6     msg := make(chan string, 2) //channel (bidirectional channel) of type string
  7 
  8     msg <- "hi whats up"
  9     fmt.Println("*****I am main go routine*****")
 10 
 11     go func() {
 12         fmt.Println("*****HI ABHI *****\n")
 13         temp := <-msg
 14         fmt.Println(temp)
 15         msg <- "Hello from a goroutine!" //send a string through the channel
 16     }()
 17 
 18     fmt.Println("Main routine waiting for message")
 19 
 20     fmt.Println(<-msg) //receive the string from the channel
 21     fmt.Println(<-msg)
 22 }  

获取以下错误:

*****我是主要的围棋套路*****

等待消息的主例程

goroutine 5[chan receive]:

main.main.func1(0xC420054060)

/users/work/go/src/github.com/golang_play/goroutine/goroutine.go:13+0x98由main.main/users/work/go/src/github.com/golang_play/goroutine/goroutine.go:11+0xe2退出状态2

同样,在下面的程序中,第14行永远不会打印。

 5 func main() {
  6     msg := make(chan string, 2) //channel (bidirectional channel) of type string
  7 
  8     msg <- "hi whats up"
  9     fmt.Println("*****I am main go routine*****")
 10 
 11     go func() {
 12         fmt.Println("*****HI ABHI *****\n")
 13         temp := <-msg
 14         fmt.Println(temp)
 15         //msg <- "Hello from a goroutine!" //send a string through the channel
 16     }()

共有1个答案

李法
2023-03-14

您试图在同一通道上以两种方式发送消息,并且您没有做任何事情来保证谁读了哪些消息。在funcgoroutine尝试从通道读取之前,主goroutine完全有可能接收到它发送的消息。如果发生这种情况,两个goroutines都会被困在等待永远不会到达的消息上。

用两个通道。

 类似资料:
  • 我不明白,当我为5分配内存时,它会打印出一个示例。我知道可以使用strncpy来完成,但有没有一种方法可以不使用strncpy来完成呢 它适用于strncpy,但有没有办法在没有strncpy的情况下做到这一点? 打印出一个示例 不应该打印OneE吗??有人能解释一下吗?

  • 问题内容: 我试图了解Go中的并发性。特别是,我编写了以下线程不安全程序: 我认识到我应该使用渠道来防止与发生竞争,但这不是重点。程序打印,然后似乎永远循环(不再打印任何内容)。我希望它能打印出无限的数字列表,可能由于竞态条件而跳过某些数字并重复其他数字(或更糟的是,在更新数字时打印数字)。 我的问题是:为什么程序只打印一行? 只是要清楚一点:对于这个玩具示例,我不是故意使用渠道。 问题答案: 关

  • 我这里有3个实体A、B和C。 实体A和实体B都与实体C有关系。在我的例子中,我有一个来自实体A的当前id,并且我想使用来自实体C的查询到达实体B。 多谢了。

  • 我试图更多地了解Go的通道和goroutine,所以我决定制作一个小程序,从对象读取的文件中计算单词: 现在,在我发现的大多数示例中,和通道都将被缓冲,比如。但是,在运行这段代码之后,我的程序仍然存在一个错误消息。 基本上,我认为我需要两个通道:一个通道将文件中的行与goroutine通信(因为它可以是任意大小的,所以我不认为我需要在函数调用中通知大小);另一个通道将从goroutine收集结果,

  • 上节我们介绍了不同平台(Windows、Linux 和 Mac OS X)下常用的 IDE,大家肯定希望赶紧实践一下,用 IDE 真正地运行一段C语言代码来看看效果,这样能够更快地获得成就感。 但是,使用 IDE 的过程中会涉及到一些与编程有关的概念,这些概念如果不提前了解,即使能够运行出程序来,也是雾里看花,知其然不知其所以然。本节的目标就是让大家对这些概念有一个简单的了解。 1) 源文件(So

  • 问题内容: 我试图在全球范围内安装,然后使用和这样的: 我看到了通常的输出,也看到了将文件复制到全局路径的操作,但是如果我尝试这样做,则会收到一条错误消息,指出未找到该模块。 我正在使用node和npm的最新版本,并且我已经知道npm在全局安装与本地安装中所做的更改,但是我 真的不想 在每个项目上都安装localy,并且我正在一个没有不支持,因此对我而言无法全局安装。 我的问题是:为什么我不需要全