我已经在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值的数组导致这么多的线程产生,我用完堆栈空间,我的电脑BSOD :(一致。很多线程,这不是很好,但技术上(如果不是理论上),这是不是一个适当的实施?
基于一点谷歌搜索,我似乎已经发现需要一个线程池。线程池解决我遇到的基本问题,我试图产生太多的线程的事实?如果是这样,你有任何关于库的建议?
谢谢你的建议和帮助!
使用线程的一个原因是使用计算机中的所有内核。在这种情况下,创建比核心更多的线程没有任何价值。 –
即使这个工作,它会很慢,递归地产生线程肯定听起来像是一场灾难的秘诀。正如Brian所提到的,一个想法是将线程限制为'std :: thread :: hardware_concurrency'的值,但即使如此,我也不确定这会比'std :: sort'更快。 – user2802841
你不应该能够从这引起BSOD ......什么操作系统?假设Windows ...什么版本? (对于我自己的好奇心,我同意已发布的答案) – TypeIA