关于go:Go编程题多协程顺次打印数字

6次阅读

共计 710 个字符,预计需要花费 2 分钟才能阅读完成。

1. 问题形容

  • 创立 N 个协程,每个协程负责打印一个数字,编程实现将所有数字依次输入。
Input:
    N = 5
Output:
    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 = 5

func 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]
}
正文完
 0