C ++中动态的线程数量

时间:2013-11-24 14:28:46

标签: c++ multithreading dynamic c++11

我的任务是对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();
}

1 个答案:

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

希望有所帮助,问我是否有任何问题(我可以详细介绍一些部分)