【发布时间】:2014-06-09 03:40:42
【问题描述】:
这个想法是编写一个程序,该程序接受许多随机数来创建,然后在用户输入的线程数之间分配负载,并测量使用多个线程时我们获得的速度提升。我的问题;但是,我添加的线程越多,我的程序运行速度就越慢。不知道出了什么问题。到目前为止,这是我的代码的 sn-p:
...
for (i=0; i<numThreads; i++){
vals *values;
values = (vals *)malloc(sizeof(vals));
values->randoms = count;
values->id = i;
pthread_create(&tid[i], NULL, run, (void *) values);
}
for (i=0; i<numThreads; i++)
pthread_join(tid[i], NULL);
timeElapsed = getMilliSeconds() - timeStart;
printf("Elapsed time: %lf seconds\n",(double)(timeElapsed/1000.0));
exit(EXIT_SUCCESS);
}
void *run(void *arg) {
vals *values;
long long int i;
long long int randoms;
values = (vals*)arg;
randoms = values->randoms;
srandom(values->id);
for (i = 0; i < randoms; i++) {
random();
}
pthread_exit(NULL);
}
vals 是一个包含两个 int 值(随机数和 id)的结构。 randoms 包含要生成的随机数数量除以线程数(以划分负载),并且 id 为每个用作种子的线程保存一个唯一的 id。我需要创建结构,以便将多个值传递给线程调用的工作函数。
任何想法为什么它会随着更多线程运行更慢?
【问题讨论】:
-
你的机器有多少个内核?
-
对不起,忘了提到核心数。目前我正在运行 2 个内核。
-
您要完成多少工作?如果
randoms是一个相当小的数字,那么设置线程所花费的时间可能会大于完成工作所花费的时间。 -
如果
random()必须锁定一个全局上下文来计算下一个随机值,这将很快发生。您可能需要查阅man-page,其中明确指出“在多个线程使用 random() 并且行为应该可重现的情况下不应使用此函数。为此目的使用random_r(3)。”而且我认为在每个 thread 上调用srandom()也不是什么好主意。 -
在worker函数中使用srandom和random不是我的主意,是项目需要的
标签: c multithreading