我正在尝试并行运行递归快速排序调用:
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
使用全局变量的轻微担忧。如果它是一个小应用程序,那可能没问题,否则我会使用在quicksort
中创建的局部变量并作为参数传递给quicksortRecursive
.