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

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]
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理