【发布时间】:2021-01-01 07:44:58
【问题描述】:
情况
我想看看使用pthread 的优势。如果我没记错的话:线程允许我并行执行程序的给定部分。
这就是我试图完成的事情:我想制作一个程序,它接受一个数字(比如说n)并输出[0..n] 的总和。
代码
#define MAX 1000000000
int
main() {
long long n = 0;
for (long long i = 1; i < MAX; ++i)
n += i;
printf("\nn: %lld\n", n);
return 0;
}
时间:0m2.723s
据我了解,我可以简单地将那个数字 MAX 除以 2 并让 2 threads
做好工作。
代码
#define MAX 1000000000
#define MAX_THREADS 2
#define STRIDE MAX / MAX_THREADS
typedef struct {
long long off;
long long res;
} arg_t;
void*
callback(void *args) {
arg_t *arg = (arg_t*)args;
for (long long i = arg->off; i < arg->off + STRIDE; ++i)
arg->res += i;
pthread_exit(0);
}
int
main() {
pthread_t threads[MAX_THREADS];
arg_t results[MAX_THREADS];
for (int i = 0; i < MAX_THREADS; ++i) {
results[i].off = i * STRIDE;
results[i].res = 0;
pthread_create(&threads[i], NULL, callback, (void*)&results[i]);
}
for (int i = 0; i < MAX_THREADS; ++i)
pthread_join(threads[i], NULL);
long long result;
result = results[0].res;
for (int i = 1; i < MAX_THREADS; ++i)
result += results[i].res;
printf("\nn: %lld\n", result);
return 0;
}
时间:0m8.530s
问题
pthread 的版本运行速度较慢。从逻辑上讲,这个版本应该运行得更快,但创建线程的成本可能更高。
有人可以提出解决方案或说明我在做什么/理解错误吗?
【问题讨论】:
-
一个体面的编译器甚至可以将第一个循环优化为单个赋值。
-
永远记得对优化的构建进行基准测试。
-
@Someprogrammerdude 你能推荐一个用于 C(操作系统:linux)的分析器吗?
标签: c multithreading pthreads