Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;多线程合并排序不工作 我是学习C++的新手,我尝试实现一个多线程版本的GysErrt。我将我的算法与许多在线实现进行了比较,结果似乎几乎相同,但是,我没有得到正确的输出。输出甚至包括原始输入中找不到的数字 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; }_C++_Multithreading_Pthreads_Mergesort - Fatal编程技术网

C++;多线程合并排序不工作 我是学习C++的新手,我尝试实现一个多线程版本的GysErrt。我将我的算法与许多在线实现进行了比较,结果似乎几乎相同,但是,我没有得到正确的输出。输出甚至包括原始输入中找不到的数字 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; }

C++;多线程合并排序不工作 我是学习C++的新手,我尝试实现一个多线程版本的GysErrt。我将我的算法与许多在线实现进行了比较,结果似乎几乎相同,但是,我没有得到正确的输出。输出甚至包括原始输入中找不到的数字 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; },c++,multithreading,pthreads,mergesort,C++,Multithreading,Pthreads,Mergesort,我正在使用以下命令编译程序:g++mergesortthread.cpp-o mergesortthread-std=c++0x-pthread 我在这里做错了什么?将两个线程推入线程池local中,然后在线程结束之前立即调用合并(需要这些线程的结果) 此代码可能会导致线程爆炸,因为每次调用mergeSort都会创建两个线程,直到到达空区域。将两个线程推入thread\u poolLocal,然后立即调用merge(需要这些线程的结果)在线程结束之前 此代码可能会导致线程爆炸,并对较大的数组进行

我正在使用以下命令编译程序:
g++mergesortthread.cpp-o mergesortthread-std=c++0x-pthread


我在这里做错了什么?

将两个线程推入
线程池local
中,然后在线程结束之前立即调用
合并
(需要这些线程的结果)


此代码可能会导致线程爆炸,因为每次调用
mergeSort
都会创建两个线程,直到到达空区域。

将两个线程推入
thread\u poolLocal
,然后立即调用
merge
(需要这些线程的结果)在线程结束之前


此代码可能会导致线程爆炸,并对较大的数组进行排序,因为每次调用
mergeSort
都会创建两个以上的线程,直到到达空区域为止。

有没有办法让它在调用merge之前等待线程完成?就线程爆炸而言,我意识到了这一点,我只是想在重构该部分之前让它正常工作。如果我能使线程在调用merge之前完成执行,那么应该可以解决这个问题吗?谢谢@DonJuma我不知道有一个标准的函数来进行等待,但是类似于(auto&t:thread_poolLocal)t.wait()的
应该可以做到这一点。不过,这并不能解决线程爆炸问题,因为是对
mergeSort
的调用导致了线程爆炸。谢谢您的回复。这实际上似乎像预期的那样起作用。谢谢唯一的问题是排序后的输出是:0,1,2,3,4,5,6,7,8,9。零是从哪里来的?为什么10会消失?这也是线程没有及时完成的结果吗?我真的很感谢所有的帮助。@DonJuma零是因为您访问的是一个超过
a
数组末尾的数组(10的结尾)。在
merge
中,
right
是要排序的范围中包含的元素,但是在主要情况下,当您应该使用
arrayLen-1
时,您会传入
数组Len
(10)作为最后一个元素。有没有办法让它在调用merge之前等待线程完成?就线程爆炸而言,我意识到了这一点,我只是想在重构该部分之前让它正常工作。如果我能使线程在调用merge之前完成执行,那么应该可以解决这个问题吗?谢谢@DonJuma我不知道有一个标准的函数来进行等待,但是类似于(auto&t:thread_poolLocal)t.wait()的
应该可以做到这一点。不过,这并不能解决线程爆炸问题,因为是对
mergeSort
的调用导致了线程爆炸。谢谢您的回复。这实际上似乎像预期的那样起作用。谢谢唯一的问题是排序后的输出是:0,1,2,3,4,5,6,7,8,9。零是从哪里来的?为什么10会消失?这也是线程没有及时完成的结果吗?我真的很感谢所有的帮助。@DonJuma零是因为您访问的是一个超过
a
数组末尾的数组(10的结尾)。在您的
合并
中,
是要排序的范围中包含的元素,但在主要情况下,当您应该使用
数组Len-1时,您会将
数组Len
(10)作为最后一个元素传入。
Length of array = 10
10 9 8 7 6 5 4 3 2 1

0 1 4 2 3 10 5 6 9 7