我正在try 学习更多关于Golang中的并发性的知识,所以我正在try 改进MergeSort算法来进行并发排序.
我的 idea 是每次将数组一分为二时创建一个goroutine,所以我的代码是这样的:
func mergeSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
mid := len(arr) / 2
left := arr[:mid]
right := arr[mid:]
orderedLeft := make(chan []int)
orderedRight := make(chan []int)
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
left = mergeSort(left)
orderedLeft <- left
}()
go func() {
defer wg.Done()
right = mergeSort(right)
orderedRight <- right
}()
wg.Wait()
close(orderedLeft)
close(orderedRight)
left = <-orderedLeft
fmt.Println(left)
right = <-orderedRight
fmt.Println(right)
return merge(left, right)
}
但我得到了一个致命的错误:
fatal error: all goroutines are asleep - deadlock!
我做错了什么?