【发布时间】:2013-10-18 20:08:51
【问题描述】:
我添加了一个线程来计算第一个数组的 3,而主进程生成第二个数组。我认为这会使程序更快,但在 Linux 上使用 time 命令后,带线程的一个用了 0m7.627s,另一个用了 0m5.701s。 起初我以为我使用了一个非常小的长度,并且由于创建线程的时间而变得更大,但事实并非如此。时间差与长度成正比... 这仅适用于更多线程吗? (也许在另一个例子中) 难道我做错了什么? 另外我不明白 pthread_join(..., this) 的第二个参数是如何工作的,我尝试了很多不同的方式,但它从来没有工作过。我的帮助会很棒,谢谢。
没有线程:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>
#define LENGTH 100000000
void * count3s(void * i){
int numberOf3 = 0;
int * j = (int *) i;
int counter = 0;
for(counter = 0; counter < LENGTH; counter++){
if(*(j+counter) == 3){
numberOf3++;
}
}
*((int *) i) = numberOf3;
return i;
}
int main(int argc, char *argv[]){
pthread_t p0, p1;
int * i = (int *) malloc(sizeof(int)*LENGTH);
int * j = (int *) malloc(sizeof(int)*LENGTH);
int c = 0, d = 0;
srand(0);
for(c=0;c<LENGTH;c++){
*(i+c) = rand() % 4;
}
for(c=0;c<LENGTH;c++){
*(j+c) = rand() % 4;
}
d = *((int *) count3s((void *) i));
c = *((int *) count3s((void *) j));
printf("C:%d, D:%d\n", c, *i);
return 0;
}
有线程:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>
#define LENGTH 100000000
void * count3s(void * i){
int numberOf3 = 0;
int * j = (int *) i;
int counter = 0;
for(counter = 0; counter < LENGTH; counter++){
if(*(j+counter) == 3){
numberOf3++;
}
}
*((int *) i) = numberOf3;
return i;
}
int main(int argc, char *argv[]){
pthread_t p0, p1;
int * i = (int *) malloc(sizeof(int)*LENGTH);
int * j = (int *) malloc(sizeof(int)*LENGTH);
int c = 0, d = 0;
srand(0);
for(c=0;c<LENGTH;c++){
*(i+c) = rand() % 4;
}
//thread starts counting 3's
pthread_create(&p0, NULL, count3s,(void *)i); //thread created
for(c=0;c<LENGTH;c++){
*(j+c) = rand() % 4;
}
pthread_join(p0, NULL);
c = *((int *) count3s((void *) j));
printf("C:%d, D:%d\n", c, *i);
return 0;
}
【问题讨论】:
-
尝试将您的
pthread_join呼叫移动到第二个count3s呼叫下方。就目前而言,您正在强制在第二次计数开始之前完成第一次计数。您也可以将第一个随机生成循环移动到线程中,以便生成和计数可以并行运行。 -
我尝试了你的第一个建议,没有任何改变。第二个没看懂?这不会是分段错误错误吗?编辑:刚刚尝试了第二个 + 第一个,更糟的是,现在需要 10 秒。我认为它等待另一个完成。但是感谢您的帮助。有什么想法吗?
-
我无法重现结果。在我的机器上没有可测量的差异。
-
你测量了多少次执行时间?您应该进行多次测量,以减少操作系统中断您执行更重要任务的可能性,从而导致结果出现偏差。
-
我做了很多,greeny,它总是一样的。 Timo 尝试增加长度,或者按照 Nathan 说的做……这可能是我电脑的问题。不过,我对此表示怀疑。
标签: c multithreading pthreads