1 两个channel 版本
package main
import ("fmt"
"sync")
var wg sync.WaitGroup
var c1 chan int
var c2 chan int
func A(){
defer wg.Done()
for i:=0;i<10;i++ {
<-c1
fmt.Println(2*i)
c2<-1 //牵引协程
}
}
func B(){
defer wg.Done()
for i:=0;i<10;i++ {
<-c2
fmt.Println(2*i+1)
c1<-1
}
}
func main () {
wg = sync.WaitGroup{} //初始化
c1 = make(chan int, 1) //有缓存,不然会死锁
c2 = make(chan int)
wg.Add(2)
go A() //协程执行函数
go B()
c1<-1 //启动协程
wg.Wait()
fmt.Println("hello https://tool.lu/")
}
无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。
这种类型的通道要求发送 goroutine 和接收 goroutine同时准备好,才能完成发送和接收操作。
如果都使用无缓冲通道,需要小修一下B()函数,避免死锁。
package main
import ("fmt"
"sync")
var wg sync.WaitGroup
var c1 chan int
var c2 chan int
func A(){
defer wg.Done()
for i:=0;i<10;i++ {
<-c1
fmt.Println(2*i)
c2<-1
}
}
func B(){
defer wg.Done()
for i:=0;i<10;i++ {
<-c2
fmt.Println(2*i+1)
if i < 9 { //临结束时候,不再写入
c1<-1
}
}
}
func main () {
wg = sync.WaitGroup{}
c1 = make(chan int)
c2 = make(chan int)
wg.Add(2)
go A()
go B()
c1<-1
wg.Wait()
fmt.Println("hello https://tool.lu/")
}
2 1个通道版本
- 奇偶打印条件过滤
- 管道自牵引
package main
import ("fmt"
"sync")
var wg sync.WaitGroup
var c1 chan int
func A(){
defer wg.Done()
for i:=0;i<10;i++ {
<-c1
if i%2 == 0 {
fmt.Println(i)
}
}
}
func B(){
defer wg.Done()
for i:=0;i<10;i++ {
c1<-1
if i%2 == 1 {
fmt.Println(i)
}
}
}
func main () {
wg = sync.WaitGroup{}
c1 = make(chan int)
wg.Add(2)
go A()
go B()
wg.Wait()
fmt.Println("hello https://tool.lu/")
}
3 不使用 channel
package main
import ("fmt"
"sync")
var wg sync.WaitGroup
var i int
func A(){
defer wg.Done()
for ;i<10; {
if i%2 == 0 {
fmt.Println(i)
i++
}
}
}
func B(){
defer wg.Done()
for ;i<10; {
if i%2 == 1 {
fmt.Println(i)
i++
}
}
}
func main () {
wg = sync.WaitGroup{}
i = 0
wg.Add(2)
go A()
go B()
wg.Wait()
fmt.Println("hello https://tool.lu/")
}