CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
最近在学习 Go,看到师兄在群里分享了一道他面阿里的面试题:
创建两个线程,一个线程负责打印偶数,另外一个线程打印奇数。要求:按顺序打印出 1-100。
因为我刚学 Go 不久,就想着就用 channel 实现就好了,创建 3 个信号量(channel)应该就可以解决这个问题, 可以把 channel 看成一个信号量,goroutine 进入时,首先去从channel 里读,相当于 P 操作;往 channel 写,相当于 V 操作。
- chan1: 控制打印奇数的 goroutine
- chan2: 控制打印偶数的 goroutine
- final_chan: 控制主 goroutine
具体代码如下:
package main
import (
"fmt"
)
func main() {
chan1 := make(chan struct{}, 1)
chan2 := make(chan struct{}, 1)
chan_final := make(chan struct{}, 1)
chan1 <- struct{}{}
N := 100
go func(N int) {
for i := 1; i <= N; i += 2 {
<-chan1
fmt.Println(i)
chan2 <- struct{}{}
}
}(N)
go func(N int) {
for i := 2; i <= N; i += 2 {
<-chan2
fmt.Println(i)
if i == N {
chan_final <- struct{}{}
}
chan1 <- struct{}{}
}
}(N)
<-chan_final
}
当然,我看到师兄的实现貌似用到一些其他我还没了解的 Go 的知识,以后学习之后再优化一下吧!