目录
- 方法一:使用两个channel
- 方法二:使用一个channel
方法一:使用两个channel
这里channel CA 必须要有缓冲区,否则最后会报错 fatal 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()
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)