首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在固定线程数之间划分数组

在固定线程数之间划分数组
EN

Stack Overflow用户
提问于 2014-02-07 18:59:10
回答 1查看 3.6K关注 0票数 3

我想以公平的方式将可变大小的数组数据拆分到固定线程数的中。

案例1:在4个线程之间公平地划分Data7 ()

线程ID 0: Data,Data1线程ID 1: Data2,Data3线程ID 2: Data4,Data5线程ID 3: Data6

现在,我的代码不公平地划分了数组。

案例2:将Data7划分为4个线程()

线程ID 0:数据线程ID 1: Data1线程ID 2: Data2线程ID 3: Data3、Data4、Data5、Data6

下面是实现Case 2的代码。

代码语言:javascript
运行
复制
#include <iostream>
using namespace std;

const unsigned int NUMELEM = 7;
const unsigned int THREADCNT = 4;

unsigned int elemPerThread = NUMELEM/THREADCNT;
unsigned int remElements = NUMELEM % THREADCNT;

int Data[NUMELEM];

void DoStuff( unsigned int const& thid )
{
    unsigned int startIndex = thid*elemPerThread;
    unsigned int endIndex = startIndex + elemPerThread;

    cout<<"Thread ID "<<thid<<": ";
    for( unsigned int index = startIndex; index != endIndex; index++ )
    {
        cout<<"Data["<<index<<"], ";
    }

    if( (thid+1) == THREADCNT )
    {
        for( unsigned i = 0; i!= remElements; i++)
        {
            cout<<"Data["<<endIndex + i<<"], ";
        }
    }

    cout<<endl;
}

int main()
{
    for( unsigned int thid = 0; thid != THREADCNT; thid++)
    {
        // TBU: Make multithreaded
        DoStuff( thid );
    }

    return 0;
}

我想要案例1的解决方案

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-07 19:40:12

抱歉,我的代码又快又脏,但我认为它是起作用的。

代码语言:javascript
运行
复制
void DoStuff( unsigned int const& thid )
{
    cout<<"ThID:"<<thid<<endl;
    const unsigned numTasks = NUMELEM/THREADCNT, numTougherThreads = NUMELEM%THREADCNT;
    for( unsigned int index0 = (thid < numTougherThreads ? thid * (numTasks+1) : NUMELEM - (THREADCNT - thid) * numTasks), index = index0; index < index0 + numTasks + (thid < numTougherThreads) ; ++index)
    {
        cout<<"Data["<<index<<"], ";
    }
    cout<<endl;
}

http://ideone.com/3CeMm8 (@dasblinkenlight‘s的叉子)

我的代码背后的想法是:

  1. thread0负责第一个(NUMELEM/THREADCNT)+1任务;thread1负责下一个(NUMELEM/THREADCNT)+1任务.
  2. 同时,最后一个线程负责最后一个 (NUMELEM/THREADCNT)任务;第二个最后一个线程负责第二个 (NUMELEM/THREADCNT)任务.
  3. 只有第一个(NUMELEM%THREADCNT)线程(“更硬的”线程)有(NUMELEM/THREADCNT)+1任务。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21635702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档