计算C中线程的运行时间

时间:2017-01-15 12:50:50

标签: c pthreads

我在main中单独运行时计算了两个函数的运行时间。迭代版本需要17秒,递归版本需要28秒。现在我正在努力学习线程。我想的是创建具有不同功能的两个线程,在调用线程之前启动计时器,然后检查它需要多长时间,我的假设将是28s,直到两个线程退出。但问题是:程序不打印时间并打印:"线程在线程退出后开始......

问题:

1。如何修改程序以计算运行时间并希望显示28s

2。我究竟做错了什么?简要解释为什么我的程序无效。

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <limits.h>
#include <pthread.h>

#define NUMTHREADS 2
pthread_t threads[NUMTHREADS];
int sumArrayRec(int arr[], int size) {
    if (size == 1) {
        return arr[size - 1];
    } else {
        return arr[size - 1] + sumArray(arr, size - 1);
    }
}

int sumArrayIt(int arr[], int size) {
    int sum = 0;
    for (int i = 0; i<size; i++) {
        sum += arr[i];
    }
    return sum;
}

void *thread1(void *arg) {
    for (int x = 0; x < 999999999; x++) {
        sumArrayIt(arg, 10);
    }
}

void *thread2(void *arg) {
    for (int x = 0; x < 999999999; x++) {
        sumArrayRec(arg, 10);
    }
}




int main() {
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    time_t start = time(NULL);

    printf("Threads starting...");
    pthread_create(&threads[0], NULL, thread1, arr);
    pthread_create(&threads[1], NULL, thread2, arr);


    pthread_exit(NULL);
    printf("%.4f\n", (double)(time(NULL) - start));

    return 0;
}

1 个答案:

答案 0 :(得分:1)

main()中的

pthread_exit(NULL)调用退出主线程,因此后续的printf()根本不执行。

由于你想等待线程以计算时间,你需要在两个(或你感兴趣的一个线程)线程上调用pthread_join()。< / p>

像:

pthread_join(thread[0], NULL);
pthread_join(thread[1], NULL);
printf("%.4f\n", (double)(time(NULL) - start));

执行时间取决于硬件,操作系统调度,系统上运行的其他进程等。因此,您不能指望它是某个等式的函数。

您应该错误检查pthread_create()来电:

if (pthread_create(&threads[0], NULL, thread1, arr)) {
    printf(stderr, "thread creation error<n");
    exit(1);
}

if (pthread_create(&threads[1], NULL, thread2, arr)) {
    printf(stderr, "thread creation error<n");
    exit(1);
}

此外,添加return NULL;语句(因为您不需要在代码中返回值),最后您的线程按照Pthreads API的要求运行。