还是发生了死锁
时间: 2023-07-19 16:12:30 浏览: 73
非常抱歉,我之前的回答有误。这个程序确实还是存在死锁问题的。问题在于,当程序运行到最后一个 `select` 语句时,如果此时 `ch1` 和 `ch2` 中没有数据,那么程序就会一直阻塞,而无法退出。
为了解决这个问题,我们可以使用一个计数器来记录已经打印的数字的数量,当数量达到 100 时,就可以退出程序。具体实现如下:
```
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(3)
ch1 := make(chan int, 1)
ch2 := make(chan int, 1)
go func() {
defer wg.Done()
for i := 1; i <= 100; i += 2 {
fmt.Println("Goroutine 1:", i)
ch1 <- i
<-ch2
}
}()
go func() {
defer wg.Done()
for i := 2; i <= 100; i += 2 {
fmt.Println("Goroutine 2:", i)
ch2 <- i
<-ch1
}
}()
go func() {
defer wg.Done()
count := 0
for {
select {
case num := <-ch1:
fmt.Println("Goroutine 1:", num)
count++
case num := <-ch2:
fmt.Println("Goroutine 2:", num)
count++
default:
if count == 100 {
return
}
}
}
}()
wg.Wait()
}
```
在这个版本的程序中,我们使用了一个无限循环,不断地从 `ch1` 和 `ch2` 中读取数据,直到已经打印了 100 个数字。如果此时 `ch1` 和 `ch2` 中没有数据可读,就使用 `default` 分支来检查是否已经打印了 100 个数字,如果是,则退出循环,程序结束。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)