我的任务是对N个整数表进行排序。我从文件中读取的每个表都存储在一个数组中。 我想创建一个程序,用户可以选择要对所有表进行排序的线程数(每个线程一个表)。我不知道如何解决这种情况,例如我使用4个线程并有11个数组进行排序。
我的代码(不合适):</ p>
#include <thread>
for (int i = 0; i < amountOfThreads; i++)
{
listOfThreads[i] = thread();
}
// ...
while (!listOfArraysToBeSort.empty())
{
for (int i = 0; i < amountOfThreads; i++)
{
if (i>amountOfThreads) i = 0;
thread t1( listOfArraysToBeSort[index2]);
listOfThreads.push_back(t1);
listOfArraysToBeSort.erase(listOfArraysToBeSort.begin()+index2);
index2++;
}
thread t1(&ArrayToBeSort::startASM, &listOfArraysToBeSort[index2]);
t1.join();
}
答案 0 :(得分:0)
您可以按包拆分线程:如果您有5个线程和11个阵列,那么您将处理5个,5个和1个线程。 这是一个示例代码。
我没有文件,我动态生成数据,但这部分与排序部分分开,所以没有可能的混淆
#include <random>
#include <vector>
#include <iostream>
#include <thread>
#include <algorithm>
using namespace std;
int generateData(vector<vector<int>>& vData)
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 1000000);
const int nbElemsPerVec=1000000;
int nbArray;
cout<<"How many arrays" << endl;
cin >> nbArray;
for (int i=0;i<nbArray;++i)
{
vector<int> vArr;
for (int j=0; j<nbElemsPerVec; ++j)
{
vArr.push_back(dis(gen));
}
vData.push_back(vArr);
}
return 0;
}
int sortData(vector<vector<int>>& vData, int nbThreads)
{
vector<thread> vThreads;
int nbArray=vData.size();
int nbArrayPerThread=nbArray/nbThreads+1;
for (int i=0;i<nbThreads;++i)
{
vThreads.push_back(
std::thread ([i, nbArrayPerThread,nbArray,&vData]{
for (int j=0;j<nbArrayPerThread;++j)
{
if (i*nbArrayPerThread+j < nbArray)//to avoid out of bounds exception
{
std::sort(vData[i*nbArrayPerThread+j].begin(),(vData[i*nbArrayPerThread+j].end()));
}
}
})
);
}
for (auto it=vThreads.begin(); it!=vThreads.end();++it)
{
it->join();
}
return 0;
}
int main()
{
int nbArray,nbThreads;
vector<vector<int>> vAllData;//array of vectors to be sorted out
generateData(vAllData);
nbArray=vAllData.size();
cout <<"How many threads"<<endl;
cin>>nbThreads;
nbThreads=min(nbThreads,nbArray);
sortData(vAllData,nbThreads);
return 0;
}
希望有所帮助,问我是否有任何问题(我可以详细介绍一些部分)