【问题标题】:Orchestrate recursive quicksort calls via WaitGroup通过 WaitGroup 编排递归快速排序调用
【发布时间】: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


【解决方案1】:

如果它工作正常,那么它是正确的。就代码质量而言,除了对WaitGroup 的全局变量的使用稍有担心之外,我认为该方法没有任何问题。如果它是一个小应用程序,它可能没问题,否则我会使用在quicksort 创建的局部变量并作为参数传递给quicksortRecursive

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多