我是学习c ++的新手,我正在尝试实现MergeSort的多线程版本。我已经将我的算法与在线的众多实现进行了比较,看起来几乎相同,但是,我没有得到正确的输出。输出甚至包括原始输入中找不到的数字。
using namespace std;
int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; /* target array */
int arrayLen;
void merge(int low, int mid, int high)
{
int left = low;
int right = mid+1;
int b[high-low+1];
int i, cur = 0;
while(left <= mid && right <= high) {
if (a[left] <= a[right])
b[cur++] = a[left++];
else
b[cur++] = a[right++];
}
while(left <= mid) b[cur++] = a[left++];
while(right <= high) b[cur++] = a[right++];
cur--;
while (cur >= 0){
a[low + cur] = b[cur];
cur--;
}
}
void mergeSort(int p, int r){
std::vector<std::future<void>> thread_poolLocal;
int q;
if (p >= r) return;
q = (p+r)/2;
thread_poolLocal.push_back( std::async(launch::async, mergeSort, p, q));
thread_poolLocal.push_back( std::async(launch::async, mergeSort, q+1, r));
merge(p, q, r);
}
int main()
{
arrayLen = (sizeof(a)/sizeof(*a));
cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << endl;
int i;
for (i = 0; i < arrayLen; i++) printf ("%d ", a[i]);
cout << "\n" << endl;
mergeSort(0, arrayLen);
for (i = 0; i < arrayLen; i++) printf ("%d ", a[i]);
return 0;
}
当我使用上面显示的简单数组测试时,输出为:
Length of array = 10
10 9 8 7 6 5 4 3 2 1
0 1 4 2 3 10 5 6 9 7
我正在使用以下代码编译程序:g++ mergeSortThreaded.cpp -o mergeSortThreaded -std=c++0x -pthread
我在这里做错了什么?
答案 0 :(得分:0)
你将2个线程推入thread_poolLocal
,然后在线程结束之前立即调用merge
(需要这些线程的结果)。
此代码可能导致线程爆炸,更大的数组被排序,因为每次调用mergeSort
都会创建2个以上的线程,直到您进入空区域。