package main
import (
"fmt"
"sync"
"sync/atomic"
)
func fish(wg *sync.WaitGroup, counter uint64, fishch, catch chan int) {
//for {
// if counter == 2 {
// wg.Done()
// return
// }
for i := uint64(0); i < counter; i++ {
<-fishch
fmt.Println("fish")
//atomic.AddUint64(&counter, 1) // 原子操作,悲观锁,这里是值拷贝,不加锁也无妨
catch <- 1
}
wg.Done()
}
func dog(wg *sync.WaitGroup, counter uint64, dogch, fishch chan int) {
for {
if counter == 2 {
wg.Done()
return
}
<-dogch
fmt.Println("dog")
counter++
fishch <- 1
}
}
func cat(wg *sync.WaitGroup, counter uint64, catch, dogch chan int) {
for {
if counter == 2 {
wg.Done()
return
}
<-catch
fmt.Println("cat")
atomic.AddUint64(&counter, 1)
dogch <- 1
}
}
func main() {
var (
wg sync.WaitGroup
catcounter uint64
//fishcounter uint64
dogcounter uint64
)
dogch := make(chan int, 1)
fishch := make(chan int, 1)
catch := make(chan int, 1)
wg.Add(3)
catch <- 1 // 第一个协程入口的触发条件,否则死锁
go cat(&wg, catcounter, catch, dogch)
go dog(&wg, catcounter, dogch, fishch)
go fish(&wg, 2, fishch, catch)
wg.Wait()
}
go 使用锁和chanel按顺序进行协程调度的练习
最新推荐文章于 2023-10-26 23:33:55 发布