0
スレッドライブラリを使用して並列シェルソートを実装しようとしています。C++のスレッドを使用したシェルソート
私は、THNに部品をintの初期配列を分割THNのスレッドでそれらを並べ替え、最後にそれらを一緒にマージする必要があります。以下のコードは、最初はスレッド内のソートが正しく動作しない理由を知りたいので(警告や間違いはなく、intはソートされていないので)、マージ部分がありません。
私はスレッドの作業を簡単な例でチェックしましたが、すべて正常でした。
誰も私に間違っていることを教えてもらえますか?
#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. 'main()'のスレッドベクトルに 'std :: vector'と 'emplace_back'を使ってください。 2.スレッド構築呼び出しの 'wp'パラメータは' std :: ref(wp) 'の参照でラップされるべきです。例:パラメータは 'shellSort、std :: ref(wp)、i'でなければなりません。 –
WhozCraig
@WhozCraig、ありがとう!私はそれを前に見たが、これを完全に忘れてしまった。今は大丈夫だ! – Chet