我在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;
}
答案 0 :(得分:1)
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的要求运行。