在过去的几天里,我一直在刷新关于排序算法的记忆,我遇到了一种情况,我找不到最好的解决方案是什么。
我写了一个快速排序的基本实现,我想通过并行执行来提高它的性能。
我所拥有的是:
template <typename IteratorType>
void quicksort(IteratorType begin, IteratorType end)
{
if (distance(begin, end) > 1)
{
const IteratorType pivot = partition(begin, end);
if (distance(begin, end) > 10000)
{
thread t1([&begin, &pivot](){ quicksort(begin, pivot); });
thread t2([&pivot, &end](){ quicksort(pivot + 1, end); });
t1.join();
t2.join();
}
}
}
虽然这比天真的“无线程”实现更好,但它有严重的局限性,即:
- 如果要排序的数组太大或递归太深,系统可能会耗尽线程并且执行会惨遭失败。
- 可以避免在每个递归调用中创建线程的成本,特别是考虑到线程不是无限资源。
我想使用线程池来避免创建后期线程,但我面临另一个问题:
- 我创建的大多数线程首先完成所有工作,然后在等待完成时什么也不做。这导致许多线程只是在等待子调用完成,这似乎不是最理想的。
有没有我可以使用的技术/实体来避免浪费线程(允许它们重用)?
我可以使用 boost 或任何 C++11 工具。