方法一:使用两个channel
CAfatal error: all goroutines are asleep - deadlock!
CA
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var CA chan int
var CB chan int
func main(){
wg = sync.WaitGroup{}
CA = make(chan int,1)
CB = make(chan int)
wg.Add(2)
go A()
go B()
CA<-1
wg.Wait()
}
func A(){
for i:=0;i<5;i++{
<-CA
fmt.Println(2*i)
CB<-1
}
wg.Done()
}
func B(){
for i:=0;i<5;i++{
<-CB
fmt.Println(2*i+1)
CA<-1
}
wg.Done()
}
方法二 :使用一个channel
使用无缓冲的channel,使两个协程同步,按照相同的步调执行,但因为要交替打印所以不能每次同步后都打印,要让该输出的协程输出,不该输出的协程不输出
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var CA chan int
func main(){
wg = sync.WaitGroup{}
CA = make(chan int)
wg.Add(2)
go A()
go B()
wg.Wait()
}
func A(){
for i:=0;i<10;i++{
CA<-1
if i%2 == 0{
fmt.Println(i)
}
}
wg.Done()
}
func B(){
for i:=0;i<10;i++{
<-CA
if i%2 == 1{
fmt.Println(i)
}
}
wg.Done()
}
方法三 不使用channel
本次协程不打印时,让代码自旋;等待另外的协程递增而引起本协程再次进入业务代码。
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main(){
wg.Add(2)
i:=0
go func(){
defer wg.Done()
for {
if i>100{
break
}
if i%2 == 0{
fmt.Printf("a: %d\n",i)
i++
}
}
}()
go func(){
defer wg.Done()
for {
if i>100{
break
}
if i%2 == 1{
fmt.Printf("b: %d\n",i)
i++
}
}
}()
wg.Wait()
}