【发布时间】:2014-02-10 10:11:36
【问题描述】:
我已经在 C++ 中实现了一个有效的多线程合并排序,但我碰壁了。
在我的实现中,我递归地将一个输入向量分成两部分,然后将这两部分线程化:
void MergeSort(vector<int> *in)
{
if(in->size() < 2)
return;
vector<int>::iterator ite = in->begin();
vector<int> left = vector<int> (ite, ite + in->size()/2);
vector<int> right = vector<int> (ite + in->size()/2, in->end() );
//current thread spawns 2 threads HERE
thread t1 = thread(MergeSort, &left);
thread t2 = thread(MergeSort, &right);
t1.join();
t2.join();
vector<int> ret;
ret.reserve(in->size() );
ret = MergeSortMerge(left, right);
in->clear();
in->insert(in->begin(), ret.begin(), ret.end() );
return;
}
代码看起来很漂亮,但它是我写过的最恶毒的代码之一。尝试对超过 1000 个 int 值的数组进行排序会导致产生如此多的线程,以至于我的堆栈空间不足,并且我的计算机蓝屏 :( 始终如一。
我很清楚这段代码产生这么多线程的原因,这不是很好,但从技术上(如果不是理论上),这不是一个正确的实现吗?
根据一些谷歌搜索,我似乎发现需要一个线程池。使用线程池会解决我遇到的基本问题,即我试图产生太多线程的事实吗?如果有,您对图书馆有什么建议吗?
感谢您的建议和帮助!
【问题讨论】:
-
使用线程的一个原因是使用计算机中的所有内核。在这种情况下,线程数多于内核数没有任何价值。
-
即使这样可行,它也会很慢并且递归地产生线程听起来确实像是一场灾难。正如 Brian 所提到的,一个想法是将线程限制为
std::thread::hardware_concurrency的值,但即便如此我也不确定这会比std::sort更快。 -
您不应该因此导致蓝屏死机……什么操作系统?假设 Windows ...什么版本? (出于我自己的好奇心。我同意已经发布的答案。)
-
@user2802841 我完全同意这不是最快的实现(设计有缺陷)。你有什么更好的参考吗?
-
@dvnrrs 我正在运行 Windows 7 Ultimate,版本 6.1,SP1。那很有意思。如果您要在 Windows 环境中运行上述代码,您期望会发生什么?即当您用完堆栈空间时会发生什么(......这是真的发生了什么)?
标签: c++ multithreading threadpool callstack thread-synchronization