为什么使用线程的程序需要更多时间?

时间:2013-10-18 20:08:51

标签: c multithreading pthreads

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

2 个答案:

答案 0 :(得分:0)

因为创建线程不是免费的

答案 1 :(得分: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