日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

go語言實現兩個協程交替打印_Golang

作者:CJ-cooper ? 更新時間: 2022-05-27 編程語言

方法一:使用兩個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()

}

原文鏈接:https://blog.csdn.net/weixin_45901764/article/details/123709095

欄目分類
最近更新