目前我正在开发一个程序,它使用线程来计算平方根的总和。我的程序工作,但其中一个要求是使用主线程来查找初始值,并且一旦我从main调用函数Void * calc,程序就会中断。是否有某种方法可以进行这样的函数调用?这是因为函数是指针吗?任何帮助表示赞赏。
#include <pthread.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#define NUM_THREADS 3
int ARGV;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
double total = 0;
void *calc(void* t){
int ph = (int)t + 1;
int start, stop, interval_size;
interval_size = ARGV/(NUM_THREADS + 1);
start = ((ph) * interval_size) + 1;
stop = (ph * interval_size) + 1;
double ttl;
int i;
for (i = start; i <= stop; i++){
ttl = ttl + sqrt(i);
printf("Total Thread %i %lf\n", ph, ttl);
}
pthread_mutex_lock(&m);
total = total + ttl;
pthread_mutex_unlock(&m);
pthread_exit(NULL);
}
int main(int argc, char* argv[]) {
int i;
double ttl;
ARGV = atoi(argv[1]);
pthread_t ti[NUM_THREADS];
calc(0);
for (i = 0; i < NUM_THREADS; i++) {
pthread_create(&ti[i], NULL, calc,(void *)i);
}
/*for (i = 1; i <= (ARGV / 4) ; i++){
ttl = ttl + sqrt(i);
}*/
for (i = 0; i < NUM_THREADS; i++) {
pthread_join(ti[i], NULL);
}
total = total + ttl;
printf("Result: %lf\n", total);
}
程序中断,因为函数似乎只调用一次,而不是使用该函数的每个线程。打印出的唯一值是一些模糊不正确的数字。
答案 0 :(得分:8)
您的calc
功能pthread_exit
。现在pthread_exit
可以而且应该从主线程中调用,所以很好
允许其他线程继续执行,主线程 应该通过调用pthread_exit()而不是exit(3)来终止。
但是由于这在任何其他线程创建之前发生,程序就会立即退出,而不会启动其他线程。