共计 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]
}
正文完