目录方法一:使用两个channel方法二:使用一个channel方法一:使用两个channel 这里channel CA 必须要有缓冲区,否则最后会报错 fatal error: a
这里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
,使两个协程同步,按照相同的步调执行,但因为要交替打印所以不能每次同步后都打印,要让该输出的协程输出,不该输出的协程不输出
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()
}
到此这篇关于go语言实现两个协程交替打印的文章就介绍到这了,更多相关go协程交替打印内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: go语言实现两个协程交替打印
本文链接: https://www.lsjlt.com/news/143775.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0