为什么不';这些goroutines';工作正常吗?
这段代码是我的编程语言类的一个相当简单的演示。我试图展示一些Go允许的不同技术,比如接口和并发性,但我似乎无法让WaitGroups正常工作,因此它最终会让我陷入僵局。我最大的问题是:当goroutines停止时,如何让WaitGroups正确同步而不使系统死锁?我很可能错过了一些明显的东西为什么不';这些goroutines';工作正常吗?,go,concurrency,channel,Go,Concurrency,Channel,这段代码是我的编程语言类的一个相当简单的演示。我试图展示一些Go允许的不同技术,比如接口和并发性,但我似乎无法让WaitGroups正常工作,因此它最终会让我陷入僵局。我最大的问题是:当goroutines停止时,如何让WaitGroups正确同步而不使系统死锁?我很可能错过了一些明显的东西 package main import ( "bufio" "fmt" "os" "sync" ) func Reader(wg *sync.WaitGroup, me
package main
import (
"bufio"
"fmt"
"os"
"sync"
)
func Reader(wg *sync.WaitGroup, message chan string, done chan bool){
defer wg.Done()
reader := bufio.NewReader(os.Stdin)
for {
msg, _ := reader.ReadString('\n')
if msg == "exit\n" {
<-done
return
} else {
message <- msg
}
}
}
func main() {
message := make(chan string)
done := make(chan bool)
wg := &sync.WaitGroup{}
wg.Add(1)
go Reader(wg, message, done)
wg.Add(1)
go func(){
defer wg.Done()
for {
select {
case <-done:
return
case msg := <-message:
fmt.Println("main: "+msg)
}
}
}()
wg.Wait()
close(message)
close(done)
}
主程序包
进口(
“布菲奥”
“fmt”
“操作系统”
“同步”
)
func读取器(wg*sync.WaitGroup,消息更改字符串,完成更改布尔){
推迟工作组完成()
reader:=bufio.NewReader(os.Stdin)
为了{
msg,933;:=reader.ReadString('\n')
如果消息==“退出\n”{
main中的break语句中断select循环,而不是for循环。请改用return或a:
go func(){
推迟工作组完成()
为了{
挑选{
如果我要删除done
频道,然后关闭消息
。我对上面的代码库进行了快速修订,以使问题更易于阅读和修订,您的解决方案不起作用。请告诉我为什么此代码仍然导致死锁。
go func() {
defer wg.Done()
for {
select {
case <-done:
return // don't break here without label
case msg := <-message:
fmt.Println("main: " + msg)
}
}
}()
func Reader(wg *sync.WaitGroup, message chan string, done chan bool) {
defer wg.Done()
defer close(done) // close channel to signal completion
reader := bufio.NewReader(os.Stdin)
for {
msg, _ := reader.ReadString('\n')
if msg == "exit\n" {
return
} else {
message <- msg
}
}
}
package main
import (
"bufio"
"fmt"
"os"
)
func Reader(message chan string) {
defer close(message)
reader := bufio.NewReader(os.Stdin)
for {
msg, _ := reader.ReadString('\n')
if msg == "exit\n" {
return
} else {
message <- msg
}
}
}
func main() {
message := make(chan string)
go Reader(message)
for msg := range message {
fmt.Println("main: " + msg)
}
}