C中的多线程程序 - 比单线程运行时间更长

时间:2015-11-09 03:26:05

标签: c multithreading

在我的程序中,我正在计算数组中的最小值。我这样做没有线程和线程。但是,我注意到,当我增加线程数时,程序运行的时间更长(我使用timeval来计算它)。这对我来说没有多大意义,这也是我第一次尝试用线程编程。关于导致这种情况的任何想法?

#include <stdlib.h>
#include<stdio.h>
#include<pthread.h>
#include<sys/time.h>

struct timeval start_time, stop_time;

#define N_items 100;

int num_threads = 1;

int start[100];
int x[4000];
int min[100];
pthread_t tid[100];

void *thread(void *arg)
{
    int i, s;
    double my_min;

    s = *(int *) arg;

    my_min = x[s];
    for(i=s+num_threads; i<4000; i+= num_threads){
        if(x[i]<my_min)
            my_min = x[i];
    }

    min[s] = my_min;
    return NULL;

}




int main(){
    int i;
    int my_min;
    int elapsed;

    //Create array of size 4000 with random numbers
    for (i=0; i<4000; i++){
        x[i] = random()%100+1;  
    }


    gettimeofday(&start_time, NULL);

    //Create threads
    for(i = 0; i<num_threads; i++){
        start[i] = i;
        if ( pthread_create(&tid[i], NULL, thread, (void *)&start[i]) ) {
            printf("Can't create thread\n");
        }

    }

    for(i = 0; i<num_threads; i++){
        pthread_join(tid[i], NULL);
    }


    my_min = min[0];
    for(i = 0; i<num_threads; i++) {
        if(min[i]<my_min)
            my_min = min[i];
    }

    gettimeofday(&stop_time, NULL);

    printf("min is: %d\n", my_min);

    elapsed = (stop_time.tv_sec*1000000+ stop_time.tv_usec) -
              (start_time.tv_sec*1000000+ start_time.tv_usec);

    printf("Elapsed time is: %d\n", elapsed );

}

2 个答案:

答案 0 :(得分:2)

创建和销毁一个线程只是为了进行4000次快速操作是没有意义的。你在测量开销,而不是工作。

答案 1 :(得分:1)

你做错的另一件事是i += num_threads。有效地使用CPU缓存非常重要,而你在那里做的就是浪费它。

您希望使用实体顺序访问块而不是遍布整个地方。也许尝试(未经测试):

int count = 4000;
int chunk = count / num_threads;
int start = s * chunk;
int end = start + chunk;
for(int i = start; i < end; ++i)