(Go语言)使用两个协程按顺序交替打印 1 - n ,一个协程打印偶数,一个协程打印奇数

Go语言使用两个协程按顺序交替打印 1 - n ,一个协程打印偶数,一个协程打印奇数

方法一:使用两个缓冲为1的channel + sync.WaitGroup

为什么需要使用有缓冲的channel?

因为如果不使用带缓冲的channel会导致死锁问题,死锁的原因是当其中一个协程打印结束后,即执行完以后,另外一个协程就不能在向channel写数据了,导致死锁。
例如:
n = 3时,

  1. 打印奇数的协程先打印1
  2. 打印偶数的协程打印2,然后该协程执行完了
  3. 打印奇数的协程打印3,然后再向channel写数据时
    报错:fatal error: all goroutines are asleep - deadlock!
    对于无缓冲的通道,能够向通道写入数据的前提是必须有另外一个协程在读取通道
func printNumber(n int) {
   
   
	c1 := make(chan bool, 1)
	c2 := make(chan bool, 1)
	wg := sync.WaitGroup{
   
   }
	wg.Add(2)

	go func(n int) {
   
   
		defer wg.Done()
		for i := 2; i <= n; i += 2 {
   
   
			<-c1
			fmt.Println(i)
			c2 <- true
		}
	}(n)

	go func(n int) {
   
   
		defer wg.Done()
		for i := 1; i <= n; i += 2 {
   
   
			<-c2
			fmt.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值