2013-11-24 28 views
0

我的任务是对N个整数表进行排序。我从文件中读取每个表并将其存储在一个数组中。 我想创建程序,用户选择多少个线程应该对所有表进行排序(每个线程一个表)。我不知道如何解决这种情况,例如我使用4个线程并有11个数组进行排序。C++中线程的动态数量

我的代码(不正确):

#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

究竟是什么'ArrayToBeSort :: startASM',你有什么特别的问题?在填充之前你调整了'listOfThreads'的大小? –

+0

你可以参考http://stackoverflow.com/questions/17961899/thread-pool-and-execution-queue-in-c11查看线程池。 – timrau

+0

startASM do:打开带有数字的文件,将其加载到数组中并使用汇编程序编写的DLL对其进行排序。 vector listOfThreads(amountOfThreads); – user3027386

回答

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; 
} 

希望帮助,问我,如果您有任何问题(我可以详细说明一些部分)

+0

你认为你的问题解决了吗? – Gabriel