【发布时间】:2018-04-12 06:33:27
【问题描述】:
此代码用于我的编程语言类的一个相当简单的演示。我试图展示一些 Go 允许的不同技术,比如接口和并发,但我似乎无法让 WaitGroups 正常工作,所以最后它一直让我陷入僵局。我最大的问题是:当 goroutines 停止时,如何让 WaitGroups 正确同步而不使系统死锁?我很可能遗漏了一些明显的东西。
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)
}
【问题讨论】:
-
我会删除
done频道并关闭message。
标签: go concurrency channel