如何在C++中设置线程数

Ste*_*ner 5 c++ multithreading

我已经编写了以下多线程程序,用于使用std :: sort进行多线程排序.在我的程序中,grainSize是一个参数.由于grainSize或可以生成的线程数是系统相关的功能.因此,我没有得到应该将grainSize设置为的最佳值?我在Linux上工作?

 int compare(const char*,const char*)
{
   //some complex user defined logic    
}
void multThreadedSort(vector<unsigned>::iterator data, int len, int grainsize)
{
    if(len < grainsize) 
    {
        std::sort(data, data + len, compare);
    }
    else
    {
        auto future = std::async(multThreadedSort, data, len/2, grainsize);

        multThreadedSort(data + len/2, len/2, grainsize); // No need to spawn another thread just to block the calling thread which would do nothing.

        future.wait();

        std::inplace_merge(data, data + len/2, data + len, compare);
    }
}

int main(int argc, char** argv) {

    vector<unsigned> items;
    int grainSize=10;
    multThreadedSort(items.begin(),items.size(),grainSize);
    std::sort(items.begin(),items.end(),CompareSorter(compare));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要执行多线程排序.因此,对于排序大型矢量,我可以利用当今处理器中存在的多个核心.如果有人知道一个有效的算法,那么请分享.

我不知道为什么multiThreadedSort()返回的值没有排序,你看到它有一些逻辑错误,那么请让我知道相同的

gal*_*tte 8

这为您提供了最佳线程数(例如核心数):

unsigned int nThreads = std::thread::hardware_concurrency();
Run Code Online (Sandbox Code Playgroud)

在您编写它时,您的有效线程数不等于grainSize:它将取决于列表大小,并且可能远远超过grainSize.

只需将grainSize替换为:

unsigned int grainSize= std::max(items.size()/nThreads, 40);
Run Code Online (Sandbox Code Playgroud)

40是任意的但是要避免启动线程以便排序到少数项目,这将是次优的(开始线程的时间将大于排序少数项目).它可以通过反复试验进行优化,并且可能大于40.

你至少有一个错误:

multThreadedSort(data + len/2, len/2, grainsize);
Run Code Online (Sandbox Code Playgroud)

如果len是奇数(例如9),则不包括排序中的最后一项.替换为:

multThreadedSort(data + len/2, len-(len/2), grainsize);
Run Code Online (Sandbox Code Playgroud)