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.Add(1)
go func(id int) {
for {
mu.Lock()
if id == curSeq {
fmt.Println(curSeq)
curSeq += 1
mu.Unlock()
break
}
mu.Unlock()
}
wg.Done()
}(i)
}
wg.Wait()
}
2.2. 协同方案
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]
}