使用golang中goroutine顺序打印a,b,c N次
-
问题分析:
该问题中主要考虑的是golang中goroutine的基本能使用,如何控制顺序调用
可以使用golang中的chan来相互通知,然后使用sync/Waitgroup来等待goroutine完成执行结束 -
code
package main
import (
"fmt"
"sync"
)
func main(){
N := 5
var wg sync.WaitGroup
aCh := make(chan struct{})
bCh := make(chan struct{})
cCh := make(chan struct{})
go func () {
defer wg.Done()
for i:=0;i<N;i++{
<- aCh
fmt.Println("a")
bCh <- struct{}{}
}
// 此处不能省略,省略会产生死锁,aCh的发送次数会大于接收次数
<- aCh
}()
go func () {
defer wg.Done()
for i:=0;i<N;i++{
<-bCh
fmt.Println("b")
cCh <- struct{}{}
}
}()
go func () {
defer wg.Done()
for i:=0;i<N;i++{
<- cCh
fmt.Println("c")
aCh <- struct{}{}
}
}()
aCh <- struct{}{}
wg.Add(3)
wg.Wait()
}