Recursion 通过WaitGroup编排递归快速排序调用

Recursion 通过WaitGroup编排递归快速排序调用,recursion,go,concurrency,synchronization,quicksort,Recursion,Go,Concurrency,Synchronization,Quicksort,我正在尝试并行运行递归快速排序调用: 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() {

我正在尝试并行运行递归快速排序调用:

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()
是否符合犹太教义。

如果它工作正常,那么它就是正确的。就代码质量而言,我认为这种方法没有任何错误,除了对
WaitGroup
使用全局变量有点担心之外。如果它是一个小应用程序,它可能很好,否则我会使用在
快速排序
中创建的局部变量,并将其作为参数传递给
快速排序递归
,如果它工作正常,那么它就是正确的。就代码质量而言,我认为这种方法没有任何错误,除了对
WaitGroup
使用全局变量有点担心之外。如果它是一个小应用程序,它可能很好,否则我会使用在
快速排序
中创建的局部变量,并将其作为参数传递给
快速排序递归

,乍一看,我可以告诉您,该解决方案有一个显著的开销,即创建N个非并行的goroutine,并发性不是并行性乍看之下,我可以告诉你们,这个解决方案有一个显著的开销,即创建N个非并行的goroutine,并发性不是并行性