首页 > 解决方案 > C/Linux:如何将计算平均分配给线程?

问题描述

我必须计算“1”数字在从 1 到 N 的数字中出现的次数。例如,对于 11,输出为 4,因为 1 在“1”中出现一次,在“10”中出现一次,在“11”中出现两次. 例如,如果我的 N 是 1.000.000(但更大的 N 会是一个更好的例子),并且我给它 4 个线程(我首先会给每个线程相同数量的条目),我的第一个线程将计算数字从 1 到 250.000。但是从 0 到 9 它执行一次计算以找到“1”,从 10-99 它执行两次计算以找到“1”,从 100-999 它执行三个计算,依此类推,因此第一个线程将比其他(其他线程对于每个条目将有一个常数 6 的计算)。为了使每个线程具有大致相同的执行时间,我可以对我的程序应用什么策略,

这是我的分发代码(为每个线程分配相同数量的条目的代码),我必须更改它:

for(int i = 0; i < threads; i++){
        if(i == 0)
            info[i].from = 0;
        else
            info[i].from = info[i - 1].to + 1;

        info[i].to = info[i].from + n / threads - 1;

        if(i < n % threads)
            info[i].to++;

        pthread_create(&tid[i], NULL, thread_function, &info[i]);
    }

'info' 是一个结构,它保存每个线程必须计算的数字范围:

typedef struct {
    int from;
    int to;
} th_struct;

标签: clinuxmultithreading

解决方案


推荐阅读