1. 问题形容
- 创立N个协程,每个协程负责打印一个数字,编程实现将所有数字依次输入。
Input: N = 5Output: 1 2 3 4 5
2. 解决方案
2.1. 竞争计划
import ( "fmt" "sync")var N = 5// 竞争型func race() { // 以后执行到的序号 curSeq := 1 var mu sync.Mutex var wg sync.WaitGroup for i := 1; i <= N; i++ { // 将以后协程退出wg wg.Add(1) go func(id int) { for { // 尝试获取锁,并打印数据 mu.Lock() if id == curSeq { fmt.Println(curSeq) curSeq += 1 // 打印工作实现,解锁并跳出循环 mu.Unlock() break } // 发现没到本人打印的时候,解锁,把机会留给他人 mu.Unlock() } // 子协程工作实现,来到wg wg.Done() }(i) } // 主协程期待子协程实现 wg.Wait()}
2.2. 协同计划
import ( "fmt" "sync")var N = 5func collaborate() { chans := make([]chan bool, N+1) for i := 0; i <= N; i++ { chans[i] = make(chan bool) } for i := 1; i <= N; i++ { go func(id int) { // 以后协程阻塞,直到收到前一个协程的信号 <-chans[id-1] // 打印本人对应的序号 fmt.Println(id) // 告诉下一个协程干活 chans[id] <- true }(i) } chans[0] <- true // 期待最初一个协程实现工作 <-chans[N]}