问题描述
在我所看到的合并排序的多线程版本中,多线程通常是在左右子数组的递归过程中完成的(即,每个线程都被分配了自己的子数组来进行工作),并且合并操作完成了每个线程完成各自的工作后,由主线程执行。
我想知道是否有一种不错的方法可以对要合并两个已排序子数组的最终合并操作进行多线程处理?如果是这样,怎么办?
解决方法
实际上,有一种方法可以将合并任务分为两个并发线程:
- 两个子数组都排序后,
- 分配一个线程执行任务,以将元素从已排序的子数组的开头合并到目标数组的前一半,并且
- 为另一个线程分配一个不同但又互补的任务:从排序后的子数组的末尾到目标数组的后半部分(从末尾开始)合并。
- 您必须仔细编写这些合并函数,以使排序保持稳定,并且每个线程应仅写入目标数组的一半,可能从排序后的子数组中读取相同的元素,但选择不同的子数组。
我还没有看到有关多线程合并排序的文献中提到的这种方法。我不知道它的性能是否比经典的实现要好。