三个协程实现,异步交替打印abc
package main import ( "fmt" ) func printLetter(ch chan bool, letter string, nextCh chan bool, done chan bool) { for i := 0; i < 5; i++ { <-ch fmt.Println(letter) //当最后一个字母打印完最后一次的时候,需要通知其他几个协程退出,否则命中 死锁 循环等待的条件 if letter == "c" && i == 4 { done <- true // 通知其他协程任务已经完成 break } nextCh <- true } } // 死锁条件:循环等待、互斥、非抢占、请求保持 /* chan什么情况下会panic? 1、读写在一个协程 2、重复关闭chan 3、往一个已经关闭过的chan写数据 4、chan只有生产没有消费、反之 5、操作一个nil类型的chan */ func main() { ch1 := make(chan bool, 1) ch2 := make(chan bool, 1) ch3 := make(chan bool, 1) done := make(chan bool) // 用于通知任务完成的通道 go printLetter(ch1, "a", ch2, done) go printLetter(ch2, "b", ch3, done) go printLetter(ch3, "c", ch1, done) ch1 <- true // 启动第一个协程 <-done // 等待任务完成的通知 close(ch1) close(ch2) close(ch3) //wg.Wait() // 等待最后一个协程完成 close(done) }
变种:三个协程交替打印[n,m]区间内的数字
package main import "fmt" func printLetter(ch chan int, nextCh chan int, done chan bool, limit int) { for { number := <-ch fmt.Println(number) //当最后一个数字打印完的时候,需要通知其他几个协程退出,否则命中 死锁 循环等待的条件 if number == limit { done <- true // 通知其他协程任务已经完成 break } number++ nextCh <- number } } // 死锁条件:循环等待、互斥、非抢占、请求保持 /* chan什么情况下会panic? 1、读写在一个协程 2、重复关闭chan 3、往一个已经关闭过的chan写数据 4、chan只有生产没有消费、反之 5、操作一个nil类型的chan */ func main() { ch1 := make(chan int, 1) ch2 := make(chan int, 1) ch3 := make(chan int, 1) done := make(chan bool) // 用于通知任务完成的通道 n, m := 1, 10 go printLetter(ch1, ch2, done, m) go printLetter(ch2, ch3, done, m) go printLetter(ch3, ch1, done, m) ch1 <- n // 启动第一个协程 <-done // 等待任务完成的通知 close(ch1) close(ch2) close(ch3) //wg.Wait() // 等待最后一个协程完成 close(done) }
等风起的那一天,我已准备好一切
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2020-08-19 C++11 实现信号量(吃水果问题)
2018-08-19 hdu 1237 简单计算器(栈处理)
2018-08-19 hdu1022 模拟栈
2018-08-19 poj1318 Word Amalgamation 字符串排序(qsort)
2018-08-19 poj1002 字典树+map+查询单词出现次数
2018-08-19 hdu1702 ACboy needs your help again!(栈处理)