0

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

2 回答 2

0

因为创建线程不是免费的

于 2013-10-18T20:12:08.690 回答
0

如果您修改 main 以一次生成所有随机数,然后分别处理每个数组,您将看到改进。

#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;
      *(j+c) = rand() % 4;
   }
   //thread starts counting 3's
   pthread_create(&p1, NULL, count3s,(void *)j);
   pthread_create(&p0, NULL, count3s,(void *)i);       //thread created

   pthread_join(p1, NULL);
   pthread_join(p0, NULL);
   printf("C:%d, D:%d\n", *j, *i);
   return 0;
}

这给了我新结果的结果:

threads
C:24999967, D:24998864

real    0m2.994s
user    0m3.064s
sys     0m0.452s

threadless
C:24996371, D:25002460

real    0m3.510s
user    0m3.196s
sys     0m0.300s

这是一个小的改进,但它是一个改进。

以前的结果:

threads-wrong
C:24996371, D:25002460

real    0m3.840s
user    0m4.032s
sys     0m0.328s
threadless
C:24996371, D:25002460

real    0m3.518s
user    0m3.148s
sys     0m0.356s
于 2013-10-18T22:14:23.100 回答