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. 协同计划

  • 通过channel通信协同打印
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]}