N个协程交替输出0-100

问题

通过N个线程顺序循环打印从0至100,如给定N=3则输出:

thread0: 0

thread1: 1

thread2: 2

thread0: 3

thread1: 4

思路:递归实现

创建N个通道,在主协程中向通道i中发送当前需要输出的值count,开启一个协程,在该协程中完成输出后再起一个协程,并向第 i+1个通道中发送count+1,后面的过程就是递归。这种方法通过一个协程执行完成再来生成第二个协程的方式, 轮询通道的切片来完成协程之间的同步任务

package main
import (
   "fmt"
   "io"
   "strconv"
)
var (
   num   int // 要输出的最大值
   n     int // 要启动的线程数
   line  = 0 // 通道发送计数器
   exit  = make(chan bool)
   chans []chan int // 要初始化的协程数量
)
func main() {
   fmt.Println("输入线程个数:")
   _,ok := fmt.Scanf("%d\n",&n)
   if ok == io.EOF{
      return
   }
   // 创建n个通道
   chans = make([]chan int, n)
   for i := 0; i < n; i++ {
      chans[i] = make(chan int)
   }
   // 多协程启动入口
   go ChanWork(chans[0])
   // 接收要输出的最大数
   fmt.Println("输入要输出的最大数值:")
   _, ok = fmt.Scanf("%d\n", &num)
   if ok == io.EOF {
      return
   }
   // 触发协程同步执行
   chans[0] <- 0
   // 执行结束
   if <-exit {
      return
   }
}
func ChanWork(c chan int) {
   // 协程数
   lens := len(chans)
   for {
      // count为输出计数器
      if count := <-chans[line]; count <= num {
         fmt.Println("Thread"+strconv.Itoa(line)+": ", count)
         count++
         // 下一个发送通道
         line++
         if line >= lens {
            line = 0 //循环,防止索引越界
         }
         go ChanWork(chans[line])
         chans[line] <- count
      } else {
         close(exit)
         return
      }
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值