網站首頁 編程語言 正文
方法一:使用兩個channel
這里channel CA
必須要有緩沖區,否則最后會報錯 fatal error: all goroutines are asleep - deadlock!
這是因為無緩沖的通道只有在有接收方能夠接收值的時候才能發送成功,否則會一直處于等待發送的階段。因為最后交替運行完后沒有協程可以接收CA通道中的數據,所以會一直阻塞發生死鎖
package main import ( ?? ?"fmt" ?? ?"sync" ) var wg sync.WaitGroup var CA chan int var CB chan int func main(){ ?? ?wg = sync.WaitGroup{} ?? ?CA = make(chan int,1) ?? ?CB = make(chan int) ?? ?wg.Add(2) ?? ?go A() ?? ?go B() ?? ?CA<-1 ?? ?wg.Wait() } func A(){ ?? ?for i:=0;i<5;i++{ ?? ??? ?<-CA ?? ??? ?fmt.Println(2*i) ?? ??? ?CB<-1 ?? ?} ?? ?wg.Done() } func B(){ ?? ?for i:=0;i<5;i++{ ?? ??? ?<-CB ?? ??? ?fmt.Println(2*i+1) ?? ??? ?CA<-1 ?? ?} ?? ?wg.Done() }
方法二:使用一個channel
使用無緩沖的channel
,使兩個協程同步,按照相同的步調執行,但因為要交替打印所以不能每次同步后都打印,要讓該輸出的協程輸出,不該輸出的協程不輸出
package main import ( ? ?"fmt" ? ?"sync" ) var wg sync.WaitGroup var CA chan int func main(){ ? ?wg = sync.WaitGroup{} ? ?CA = make(chan int) ? ?wg.Add(2) ? ?go A() ? ?go B() ? ?wg.Wait() } func A(){ ? ?for i:=0;i<10;i++{ ? ? ? CA<-1 ? ? ? if i%2 == 0{ ? ? ? ? ?fmt.Println(i) ? ? ? } ? ?} ? ?wg.Done() } func B(){ ? ?for i:=0;i<10;i++{ ? ? ? <-CA ? ? ? if i%2 == 1{ ? ? ? ? ?fmt.Println(i) ? ? ? } ? ?} ? ?wg.Done() }
原文鏈接:https://blog.csdn.net/weixin_45901764/article/details/123709095
相關推薦
- 2023-12-23 React環境安裝配置
- 2023-03-15 k8s編排之StatefulSet知識點詳解一_云其它
- 2023-01-23 C#實現懸浮窗口的方法詳解_C#教程
- 2021-12-02 golang配制高性能sql.DB的使用_Golang
- 2022-05-11 如果解決tomcat端口號被占用
- 2022-09-03 Python?Pandas多種添加行列數據方法總結_python
- 2022-03-30 一篇文章帶你了解C語言的選擇結構_C 語言
- 2022-05-06 docker?save與docker?export的區別_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支