在c ++中使用线程进行Shell排序[重复]
Posted
技术标签:
【中文标题】在c ++中使用线程进行Shell排序[重复]【英文标题】:Shell sort using threads in c++ [duplicate] 【发布时间】:2017-05-10 15:53:21 【问题描述】:我正在尝试使用线程库实现并行 shell 排序。
我需要将初始整数数组分成 thN 个部分,在 thN 个线程中对它们进行排序,最后将它们合并在一起。下面的代码没有合并部分,因为起初我想找出线程中排序无法正常工作的原因(没有任何警告或错误,整数只是保持未排序)。
我在简单的示例中检查了线程工作,一切正常。
那么谁能告诉我我做错了什么?
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <ctime>
#include <vector>
using namespace std;
void shellSort(vector <vector<int>>& wp, int k)
int n = wp[k].size();
for (int gap = n / 2; gap > 0; gap /= 2)
for (int i = gap; i < n; i++)
int temp = wp[k][i];
int j;
for (j = i; j >= gap && wp[k][j - gap] > temp; j -= gap)
wp[k][j] = wp[k][j - gap];
wp[k][j] = temp;
int main()
int N, thN, i;
cout << "\nEnter the length of array: ";
cin >> N;
cout << "\nEnter the amount of threads: ";
cin >> thN;
int* A = new int[N];
for (i = 0; i < N; i++)
A[i] = rand() % 100;
thread* t = new thread[thN];
vector<vector<int> > wp(thN, vector<int>());
int start = 0;
for (i = 0; i < thN; i++)
for (int j = start; j < start + N / thN; j++)
wp[i].push_back(A[j]);
start += N / thN;
double endTime, startTime;
startTime = clock();
for (i = 0; i < thN; i++)
t[i] = thread(shellSort,wp,i);
for (i = 0; i < thN; i++)
t[i].join();
endTime = clock();
cout << "Runtime of shell sort: " << (endTime - startTime) / 1000 << endl;// time in miliseconds
system("pause");
【问题讨论】:
1.您应该使用std::vector<std::thread>
和emplace_back
作为main()
中的线程向量。 2. 线程构造调用中的wp
参数应该是引用包装的std::ref(wp)
。例如:参数应该是shellSort,std::ref(wp),i
@WhozCraig,哦,谢谢!我以前看过,但完全忘记了这一点..现在没关系!
【参考方案1】:
这里有答案Difference between pointer and reference as thread parameter。线程推导出参数类型并按值存储它们。这就是为什么引用不起作用,你应该使用指针。
【讨论】:
以上是关于在c ++中使用线程进行Shell排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章