我添加了一个线程来计算第一个数组的 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;
}