c - 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;
解决方案
推荐阅读
- c - 编码中的 C 简单错误 - 错误 E0144 - 如何使代码正常工作?
- mysql - MySQL 读与写锁
- java - Eclipse - 代码提案无法正常工作
- python - 简单的反向shell Python 2.7
- c++ - c ++中两个排序数组的并集
- python - 一段时间后触发一个函数 django python
- node.js - SailsJS ReferenceError:运行 WebStorm 节点调试模式时未定义模型
- rdf - 如何在语义网中发布来自 DBpedia 的链接开放数据?
- floating-point - 浮点数的格式既不是IEEE754也不是hardFloat?
- jhipster - JHipster - 在 compileJava 任务期间“文件管理器问题:尝试为类型重新创建文件”