golang两个协程交替打印1-100的奇数偶数

golang两个协程交替打印1-100的奇数偶数

解法1: 两个管道实现

奇偶携程各自的管道,在收到通知后输出,然后通过对方管道通知对方输出

func main() {

	ch0 := make(chan int)
	ch1 := make(chan int)

	go func() {
		for i := 1; i < 10; i += 2 {
			<-ch0
			fmt.Println(i)
			ch1 <- 0
		}
	}()

	go func() {
		for i := 2; i < 10; i += 2 {
			<-ch1
			fmt.Println(i)
			ch0 <- 0
		}
	}()

	ch0 <- 0

	select {}
}

解法2: 一个管道

0空间的channel会阻塞发送/接收双发,直到发送/接收双发同时就绪。
所以,可以达到控制两个协程,按照相同的步调执行。
即使,控制协程相同步调运行,还是不能控制交替打印输出。
因此,不能在步调同步后,都有输出。
所以,在步调相同之后,让该输出的协程输出,不该输出的协程不输出,始终有一个协成输出。

func main0() {

	ch := make(chan int)

	go func() {
		for i := 1; i < 10; i += 1 {
			<-ch
			if i%2 == 0 {
				fmt.Println(i)
			}
		}
	}()

	go func() {
		for i := 1; i < 10; i += 1 {
			ch <- 0
			if i%2 == 1 {
				fmt.Println(i)
			}
		}
	}()

	select {}
}
posted @ 2020-10-11 18:09  崇山峻岭  阅读(2489)  评论(0编辑  收藏  举报