【发布时间】:2017-07-20 19:05:28
【问题描述】:
我正在尝试并行运行递归快速排序调用:
func quicksort(a []int) {
quicksortRecursive(a)
wg.Wait()
insertionsort(a)
}
func quicksortRecursive(a []int) {
if len(a) > THRESHOLD {
l, r := partition(a)
wg.Add(2)
go func() {
quicksortRecursive(a[:r+1])
wg.Done()
}()
go func() {
go quicksortRecursive(a[l:])
wg.Done()
}()
}
}
go 调用对我来说显得过于笨拙。以下更易读的版本是否仍然正确?
func quicksort(a []int) {
wg.Add(1)
quicksortRecursive(a)
wg.Wait()
insertionsort(a)
}
func quicksortRecursive(a []int) {
if len(a) > THRESHOLD {
l, r := partition(a)
wg.Add(2)
go quicksortRecursive(a[:r+1])
go quicksortRecursive(a[l:])
}
wg.Done()
}
我特别想知道在同一个线程中调用初始wg.Add(1) 和相应的wg.Done() 是否符合犹太教规。
【问题讨论】:
-
乍一看,我可以告诉你,该解决方案在创建 N 个非并行的 goroutine 时有显着的开销,并发不是并行
标签: recursion go concurrency synchronization quicksort