问题
go语言实现两个goroutine交替执行打印数字和字母,效果:12AB34CD56EF…
解决方案
https://blog.csdn.net/swan_tang/article/details/103514633
这篇文章提供了两种方法,一种是使用无缓冲的channel方法,另一种为有缓冲的channel+waitgroup的方法
写一个简单的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| package main
import (
"fmt"
"sync"
)
func main() {
ch1, ch2 := make(chan bool, 1), make(chan bool, 1) //生成两个缓冲为1的chan bool
wg := sync.WaitGroup{} //生成一个WaitGroup用于主线程等待
wg.Add(2)
go func() {
defer wg.Done()
for i := 0; i < 100; i++ {
<-ch1 //从第一个channel接收信号,无信号则阻塞
fmt.Println("1")
ch2 <- true //输出后向第二个channel发送信号,用于告知线程2继续运行
}
}()
go func() {
defer wg.Done()
for i := 0; i < 100; i++ {
<-ch2 //从第二个channel接收信号,无信号则阻塞
fmt.Println("2")
ch1 <- true //输出后向第一个channel发送信号,用于告知线程1继续运行
}()
ch1 <- true //向线程1发送信号,如果不发送则都阻塞,产生死锁问题
wg.Wait() //等待线程组工作完毕
}
|
结果为:1、2循环输出