我想理解为什么这种情况会出现僵局以及为什么它不会出现这种情况。
如果我关闭goroutine中的通道,它可以正常工作,但如果我在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
}
答案 0 :(得分:6)
for slink := range links
将继续循环,直到频道关闭。所以你显然无法在循环之后关闭。当你这样做时,你就会陷入僵局,正如你所观察到的那样。