【问题标题】:dynamic amount of threads in C++C++中的动态线程数量
【发布时间】:2013-12-15 09:06:16
【问题描述】:

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

我的代码(不正确):

#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();
}

【问题讨论】:

  • ArrayToBeSort::startASM 到底是什么,你有什么特别的问题?您在填充之前正确调整了listOfThreads 的大小?
  • startASM 执行:打开带有数字的文件,将其加载到数组并使用用汇编程序编写的 DLL 对其进行排序。矢量 listOfThreads (amountOfThreads);

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


【解决方案1】:

您可以按包拆分线程:如果您有 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;
}

希望对你有帮助,有什么问题可以问我(我可以详细说明一些部分)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 2011-06-03
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2016-05-12
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多