gpt4 book ai didi

go - 关闭 chan 时出现死锁

转载 作者:IT王子 更新时间:2023-10-29 02:26:16 25 4
gpt4 key购买 nike

我想了解为什么这种情况会陷入僵局,而另一种情况却不会。

如果我在 goroutine 中关闭 channel ,它工作正常,但如果我在 WaitGroup.Wait() 之后关闭它会导致死锁。

package main

import (
"fmt"
"io/ioutil"
"os"
"sync"
)

var (
wg = sync.WaitGroup{}
links = make(chan string)
)

func rec_readdir(depth int, path string) {
files, _ := ioutil.ReadDir(path)
for _, f := range files {
if symlink, err := os.Readlink(path + "/" + f.Name()); err == nil {
links <- path + "/" + symlink
}
rec_readdir(depth+1, path+"/"+f.Name())
}
if depth == 0 {
wg.Done()
// close(links) // if close here ok
}
}

func main() {
wg.Add(1)
go rec_readdir(0, ".")

for slink := range links {
fmt.Println(slink)
}
wg.Wait()
close(links) // if close here deadlock
}

https://play.golang.org/p/Ntl_zsV5nwO

最佳答案

for slink := range links 将继续循环直到 channel 关闭。所以您显然无法在该循环之后 关闭。正如您所观察到的那样,当您这样做时,您会陷入僵局。

关于go - 关闭 chan 时出现死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48517771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com