我已經在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