c - 在线程之间平均分配进程

标签 c multithreading algorithm division

我正在尝试提出一种算法,将多个进程尽可能均匀地分配给多个线程。每个过程花费相同的时间。 进程数可以从 1 到 100 万不等。 threadCount 是固定的,可以是 4 到 48 之间的任何值。

下面的代码确实平均分配了所有工作,除了最后一种情况,我把剩下的都扔进去了。 有没有办法解决这个问题,以便更均匀地分配工作?

    void main(void)
{
    int processBegin[100];
    int processEnd[100];
    int activeProcessCount = 6243;
    int threadCount = 24;

int processsInBundle  = (int) (activeProcessCount / threadCount);
int processBalance    = activeProcessCount - (processsInBundle * threadCount);

for (int i = 0; i < threadCount; ++i)
{
    processBegin[ i ] = i * processsInBundle;
    processEnd[ i ]   = (processBegin[ i ] +  processsInBundle) - 1;
}

processEnd[ threadCount - 1 ] += processBalance;


FILE *debug = fopen("s:\\data\\testdump\\debug.csv", WRITE);
for (int i = 0; i < threadCount; ++i)
{
    int processsInBucket = (i == threadCount - 1) ? processsInBundle + processBalance : processBegin[i+1] - processBegin[i];
    fprintf(debug, "%d,start,%d,stop,%d,processsInBucket,%d\n", activeProcessCount, processBegin[i], processEnd[i], processsInBucket);
}
fclose(debug);

最佳答案

给第一个 activeProcessCount % threadCount 个线程 processInBundle + 1 个进程并给其他 processsInBundle 个。

int processInBundle  = (int) (activeProcessCount / threadCount);
int processSoFar = 0;
for (int i = 0; i < activeProcessCount % threadCount; i++){
    processBegin[i] = processSoFar;
    processSoFar += processInBundle + 1;
    processEnd[i] = processSoFar - 1;
}
for (int i = activeProcessCount % threadCount; i < threadCount; i++){
    processBegin[i] = processSoFar;
    processSoFar += processInBundle;
    processEnd[i] = processSoFar - 1;
}

关于c - 在线程之间平均分配进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18660364/

相关文章:

php - 确定 UPS 运费 API 的包裹尺寸

algorithm - 自相交多边形的最大面积

c - 我如何使用长整型作为 glib 哈希表中的键?

c - 如何正确释放一个 erlang 术语

java - 识别能够更新 UI 组件的线程

C# 在多线程应用程序中交换变量引用时需要锁定

java - 计算树的高度 - Java

c - 用 C 打印毕达哥拉斯三元组的表示

c - 2个子进程之间的管道不产生任何输出

c++ - 有没有办法在 libstdc++ 中制作原子 shared_ptr?